복붙노트

[SPRING] Spring 트랜잭션을 다른 쓰레드에 전달하는 방법은?

SPRING

Spring 트랜잭션을 다른 쓰레드에 전달하는 방법은?

아마도, 나는 잘못된 것을하고 있지만 다음과 같은 상황에서 좋은 길을 찾을 수는 없습니다.

작업을 실행하기 위해 Spring Batch를 사용하는 서비스를 유닛 테스트하고 싶습니다. 작업은 사전 구성된 AsyncTaskExecutor를 통해 개별 스레드에서 실행됩니다. 내 단위 테스트에서 나는 다음과 같이하고 싶다.

분명히 위의 모든 것은 하나의 트랜잭션 내에서 실행되어야하지만, 불행하게도 트랜잭션은 새로운 스레드로 전파되지 않습니다. (나는이 문제의 근본 원인을 이해합니다).

내 마음에 온 아이디어 :

해결법

  1. ==============================

    1.가장 간단한 해결책은 테스트 실행 중 SyncTaskExecutor를 사용하여 JobLauncher를 구성하는 것입니다.이 방법은 테스트와 동일한 스레드에서 작업이 실행되고 트랜잭션을 공유하는 방식입니다.

    가장 간단한 해결책은 테스트 실행 중 SyncTaskExecutor를 사용하여 JobLauncher를 구성하는 것입니다.이 방법은 테스트와 동일한 스레드에서 작업이 실행되고 트랜잭션을 공유하는 방식입니다.

    작업 실행자 구성을 별도의 스프링 구성 XML 파일로 이동할 수 있습니다. 두 가지 버전이 있습니다. 하나는 테스트 중에 사용되는 SyncTaskExecutor이고 다른 하나는 프로덕션 실행에 사용되는 AsyncTaskExecutor입니다.

  2. ==============================

    2.이 질문에 대한 진정한 해결책은 아니지만 작업자 스레드 내에서 수동으로 새 트랜잭션을 시작할 수 있음을 발견했습니다. 어떤 경우에는 이것이 충분할 수도 있습니다.

    이 질문에 대한 진정한 해결책은 아니지만 작업자 스레드 내에서 수동으로 새 트랜잭션을 시작할 수 있음을 발견했습니다. 어떤 경우에는 이것이 충분할 수도 있습니다.

    출처 : 스프링 프로그램 트랜잭션.

    예:

    @PersistenceContext
    private EntityManager entityManager;
    @Autowired
    private PlatformTransactionManager txManager;
    
    /* in a worker thread... */
    public void run() {
        TransactionStatus tx = txManager.getTransaction(new DefaultTransactionDefinition());
        try {
            entityManager.find(...)
            ...
            entityManager.flush(...)
            etc...
            txManager.commit(tx);
        } catch (RuntimeException e) {
            txManager.rollback(tx);
        }
    }
    
  3. ==============================

    3.별도의 설정을 원한다면 설정에서 고립 정책을 템플릿 화하고 프로퍼티 파일에서 값을 가져 오는 것이 좋습니다. 그러면 테스트 및 테스트를 위해 다양한 Spring 구성 세트를 사용하지 않아도됩니다.

    별도의 설정을 원한다면 설정에서 고립 정책을 템플릿 화하고 프로퍼티 파일에서 값을 가져 오는 것이 좋습니다. 그러면 테스트 및 테스트를 위해 다양한 Spring 구성 세트를 사용하지 않아도됩니다.

    그러나 나는 같은 정책 제작 사용법을 사용하는 것이 가장 좋습니다. 당신의 조명기 데이터가 얼마나 광대하며, 의존하지 않아도되는 데이터 (많은 양의 경우 스냅 샷에서)를 떼어 내고 재구성 한 setUp () 단계를 갖는 것이 얼마나 나쁠까요? 롤백?

  4. from https://stackoverflow.com/questions/5232351/how-to-propagate-spring-transaction-to-another-thread by cc-by-sa and MIT license