So verwenden Sie die Feder-Transaktion in Multithread
Habe ich eine Methode wie folgt:
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();
}
Können die methodB gut funktionieren? Pro mein Verständnis, methodB hängt die Transaktion von methodA, was ist, wenn methodA beendet, bevor methodB? Ich denke, nur methodA können getroffen werden, die von der Transaktion. Aber methodB nicht Begehen, da die Transaktion commited vor.
Kann ich mit @Transactional(propagation = Propagation.REQUIRES_NEW) für methodB. Diese können wir methodB haben eine neue Transaktion. Aber nach Frühling doc, der transcation von methodA sperren, wenn Sie es aufrufen methodB. Ich fühle mich sehr verwirren hier.
Kann mir jemand helfen bei diesem Problem? Vielen Dank im Voraus.
Kommentar zu dem Problem
was genau wollen Sie es tun?
InformationsquelleAutor der Frage Jacky | 2012-05-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nein,
methodB()
werden nicht in der gleichen Transaktion ausgeführt alsmethodA()
. Spring@Transactional
funktioniert nur auf einem einzigen thread - es erstellt eine Sitzung, wenn ein thread die erste enteres eine Methode, mit@Transactional
(oder eine Methode in einer Klasse mit@Transactional
), und dann begeht, wenn es geht, die Methode.In deinem Beispiel, die Transaktion wird beendet, wenn Sie den job einplanen in den thread-pool.
methodB()
haben es ist eigene Transaktion.InformationsquelleAutor der Antwort jmruc