복붙노트

[SPRING] 다중 스레드에서 스프링 트랜잭션을 사용하는 방법

SPRING

다중 스레드에서 스프링 트랜잭션을 사용하는 방법

나는 아래와 같은 방법을 가지고있다 :

ClassA.java
@Transactional
public void methodA(){        
    ExecutorService executorService = Executors.newFixedThreadPool(4);
    executorService.execute(new Runnable() {
        public void run() {
            classB.methodB();
        }
});
}
ClassB.java
@Transactional
public void methodB(){
    updateDB();
}

방법 B가 잘 작동 할 수 있습니까? 나의 이해마다, methodB는 methodA의 트랜잭션을 첨부 할 것이고, methodA가 methodB를 빠져 나간다면 어떻게 될까? 나는 methodA만이 트랜잭션에 의해 커밋 될 수 있다고 생각한다. 그러나 methodB는 트랜잭션이 커미트되기 때문에 커밋하지 않습니다.

methodB에 @Transactional (propagation = Propagation.REQUIRES_NEW)을 사용할 수 있습니까? 이것에 의해, methodB에 새로운 트랜잭션 (transaction)가 생깁니다. 그러나 Spring doc에 따르면 methodA의 변환은 methodB를 호출 할 때 일시 중단됩니다. 나는 여기에서 매우 혼란스럽게 느낀다.

누구든지이 문제에 대해 저를 도울 수 있습니까? 미리 감사드립니다.

해결법

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

    1.아니요, methodB ()는 methodA ()와 동일한 트랜잭션에서 실행되지 않습니다. Spring의 @Transactional은 단일 스레드에서만 작동합니다. 즉, 스레드가 @Transactional (또는 @Transactional이있는 클래스의 메서드)을 사용하여 메서드를 처음 엔 엔트리하면 스레드가 세션을 생성 한 다음 해당 메서드를 떠날 때 스레드를 커밋합니다.

    아니요, methodB ()는 methodA ()와 동일한 트랜잭션에서 실행되지 않습니다. Spring의 @Transactional은 단일 스레드에서만 작동합니다. 즉, 스레드가 @Transactional (또는 @Transactional이있는 클래스의 메서드)을 사용하여 메서드를 처음 엔 엔트리하면 스레드가 세션을 생성 한 다음 해당 메서드를 떠날 때 스레드를 커밋합니다.

    예제에서 스레드 풀에서 작업을 예약하면 트랜잭션이 종료됩니다. methodB ()는 자체 트랜잭션을 갖습니다.

  2. from https://stackoverflow.com/questions/10407301/how-to-use-spring-transaction-in-multithread by cc-by-sa and MIT license