0

다음과 같은 문제가 발생합니다. 일부 처리를 수행하는 일부 서비스 bean이 있으며 세트를 반복하여 각 항목에 대해 비동기 스레드를 시작합니다. 같은 다음스프링 부트는 @Async 메소드로 트랜잭션 (및 db 연결)을 전파합니다.

@Service 
public class ServiceBean { 
    @Autowired 
    private AsyncHandler asyncHandler; 

    public void doService(Set<?> theSet) { 
    for (Object obj : theSet) { 
     Future<?> future = asyncHandler.doHandle(obj); 
     // ... 
    } 
    // wait for all futures to complete 
    } 
} 

@Service 
public class AsyncHandler { 
    @Async 
    public Future<?> doHandle(Object object) { 
    // dosth 
    return future; 
    } 
} 

이제 우리는 각 스레드가 자신의 거래 및 연결 풀은 매우 빠르게 빈 실행하게됩니다하여 데이터베이스 연결을 개최 것을 알 수있다.

모든 스레드에서 트랜잭션을 공유하려면 원하는 방법은 무엇입니까?

미리 감사드립니다.

+3

수 없습니다. 트랜잭션과 연결은 ThreadLocal에 저장됩니다. 트랜잭션을 여러 스레드로 확장 할 수 없습니다. 가장 쉬운 해결책은 동시 스레드 수를 제한하는 것입니다. –

+0

"너는 할 수 없다."나는 할 수있다. 어쩌면 스프링을 커스터마이징하는 것이 필요할 것이다. ThreadLocal에서 트랜잭션을 사용하면 새로운 스레드에서 트랜잭션을 가져오고 설정할 수 있습니다. – Benny

+0

M. Dienum correct 답변을 삭제했습니다. –

답변

4

모든 스레드에서 트랜잭션을 공유하려면 원하는 방법은 무엇입니까?

하지 마십시오. 그 일은 무슨 일이 일어나는지 이해하기가 매우 어렵습니다. 트랜잭션이 트랜잭션을 생성 한 스레드에 연결되는 이유가 있습니다. 귀하의 계획은 비동기 스레드를 모두 시작한 다음 커밋 신호를 보내기 위해 완료 될 때까지 기다리는 것입니다.

그렇지 않으면 누가 거래를 완료할까요? 스레드가 트랜잭션을 롤백하면 여전히 다른 스레드에서 트랜잭션이 롤백됩니까? Connection을 분명히 전달할 수 있지만 대부분의 연결 구현이 다양한 장소에서 synchronized을 사용하고 있으므로 어쨌든 일이 직렬화 될 것으로 예상됩니다.

관련 문제