web-dev-qa-db-fra.com

Comment utiliser la transaction Spring dans le multithread

J'ai une méthode comme ci-dessous:

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

La méthodeB peut-elle bien fonctionner? Si je comprends bien, methodB attachera la transaction de methodA, et si methodA se termine avant methodB? Je suppose que seule la méthode A peut être validée par la transaction. Mais la méthode B ne sera pas validée car la transaction a été validée auparavant.

Puis-je utiliser @Transactional (propagation = Propagation.REQUIRES_NEW) pour methodB. Cela peut permettre à methodB d'avoir une nouvelle transaction. Mais selon Spring Doc, la transcation de methodA sera suspendue lorsqu'elle invoquera methodB. Je me sens très confus ici.

Quelqu'un peut-il m'aider sur cette question? Merci d'avance.

37
Jacky

Non, methodB() ne sera pas exécutée dans la même transaction que methodA(). @Transactional De Spring ne fonctionne que sur un seul thread - il crée une session lorsqu'un thread entre pour la première fois dans une méthode avec @Transactional (Ou une méthode dans une classe avec @Transactional), Puis le valide lorsqu'il quitte cette méthode.

Dans votre exemple, la transaction se terminera après avoir planifié le travail dans le pool de threads. methodB() aura sa propre transaction.

31
jmruc