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.
Author: Jacky, 2012-05-02

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ę.

 24
Author: jmruc,
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