programing

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

newstyles 2023. 8. 12. 10:05

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

아래와 같은 방법이 있습니다.

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 방법은 잘 작동할 수 있습니까?제가 알기로는 메소드 B가 메소드 A의 트랜잭션을 첨부할 것으로 알고 있는데, 메소드 B보다 먼저 메소드 A가 종료되면 어떻게 합니까?A 방법만 거래로 커밋할 수 있을 것 같습니다.그러나 이전에 거래가 시작되었기 때문에 메서드 B는 커밋하지 않을 것입니다.

@Transactional(전파 = 전파)를 사용할 수 있습니까?메서드 B의 경우 REQUESTS_NEW).이렇게 하면 메서드 B가 새 트랜잭션을 가질 수 있습니다.그러나 Spring doc에 따르면, 메소드 A가 메소드 B를 호출할 때 메소드 A의 전송이 일시 중단됩니다.저는 여기서 매우 혼란스러워요.

이 문제에 대해 누가 저를 도와줄 수 있나요?잘 부탁드립니다.

아니요.methodB()와 동일한 트랜잭션에서 실행되지 않습니다.methodA()스프링스@Transactional단일 스레드에서만 작동합니다. 스레드가 처음 메서드에 들어갈 때 세션을 만듭니다.@Transactional(또는 클래스의 메소드)@Transactional)을 클릭한 다음 해당 메서드를 종료할 때 커밋합니다.

이 예에서는 스레드 풀에서 작업을 예약한 후 트랜잭션이 종료됩니다.methodB()자신만의 거래를 하게 될 겁니다

언급URL : https://stackoverflow.com/questions/10407301/how-to-use-spring-transaction-in-multithread