Como usar a transação de primavera em multithread

Eu tenho um método como abaixo:

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(); } 

O método B pode funcionar bem? Pelo meu entendimento, o método B appendá a transação do método A, e se o método A sair antes do método B? Eu acho que apenas methodA pode ser confirmado pela transação. Mas o methodB não irá confirmar porque a transação foi confirmada antes.

Posso usar @Transactional (propagation = Propagation.REQUIRES_NEW) para methodB. Isso pode deixar o methodB ter uma nova transação. Mas, de acordo com o doc da primavera, a transcação do método A será suspensa quando invocar o método B. Eu me sinto muito confuso aqui.

Alguém pode me ajudar nessa questão? Desde já, obrigado.

Não, methodB() não será executado na mesma transação que methodA() . O @Transactional da Spring funciona apenas em um único thread – ele cria uma session quando um thread primeiro insere um método com @Transactional (ou um método em uma class com @Transactional ) e, em seguida, confirma quando sai desse método.

No seu exemplo, a transação terminará após você agendar o trabalho no pool de segmentos. methodB() terá sua própria transação.