Jak wykorzystać wiosenną transakcję w multithread
Mam metodę jak poniżej:
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();
}
Czy metoda działa dobrze? Zgodnie z moim zrozumieniem, methodB załączy transakcję metody, co jeśli metoda wyjdzie przed methodB? Myślę, że tylko metoda może być zaangażowana w transakcję. Ale methodB nie zatwierdzi, ponieważ transakcja została wcześniej zatwierdzona.
Czy mogę użyć @Transactional (propagacja = propagacja.REQUIERES_NEW) dla methodB. To może pozwolić methodB mieć nową transakcję. Ale według spring doc, transcation of metoda zawiesi się po wywołaniu metodyb. Czuję się bardzo zdezorientowany.
Czy ktoś może mi pomóc w tej sprawie? Z góry dzięki.1 answers
Nie, methodB()
nie zostaną wykonane w tej samej transakcji co methodA()
. @Transactional
sprężyny działa tylko na jednym wątku - tworzy sesję, gdy wątek najpierw wprowadza metodę z @Transactional
(lub metodę w klasie z @Transactional
), a następnie zatwierdza ją, gdy opuszcza tę metodę.
W twoim przykładzie transakcja zakończy się po zaplanowaniu zadania w puli wątków. methodB()
będzie miał własną transakcję.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-02 06:47:50