In meiner Anwendung erstellen ich Ablaufverfolgungsdatensätze in der Datenbank immer dann, wenn eine Serviceklassenfunktion aufgerufen wird. Folgendes ist ein Pseudocode. wenn functionB
0 zurück, die Spur aufgenommen in der Datenbank wird immer zurückgesetztSo implementieren Sie verschachtelte Transaktionen in Java, Spring JDBC und MySQL
public Class A {
Tracer tracer;
B b;
void functionA() {
tracer.addTrace(input);
TransactionManger.getTransaction(); // Transaction starts.
result = b.functionB();
if(result == 0) {
// rollback
} else {
// commit
}
}
}
public Class B {
Tracer tracer;
int functionB() {
tracer.addTrace(input);
TransactionManger.getTransaction(); // Transaction starts.
// Do whatever. Return.
}
}
Angenommen addTrace
Funktion einen Datensatz in der Datenbank, in der obigen Situation schreibt? Wie vermeide ich diese Situation? Sieht so aus, als ob MySQL verschachtelte Transaktionen nicht unterstützt. Also kann ich keine neue Transaktion innerhalb addTrace
bekommen und es dort schließen, damit die Änderungen in functionA
nicht festgeschrieben werden, bevor das Ergebnis von functionB
berechnet wird.
Wenn ich richtig verstehe, möchten Sie addTrace() in einer eigenen Transaktion ausführen und Commit, sobald es zurückgibt. Dafür ist die REQUIRES_NEW-Transaktionsfortpflanzung zuständig. http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#tx-propagation-requires_new. Verwenden Sie Spring besser so, wie es verwendet werden soll: mit deklarativer Transaktionsverarbeitung. –
Ja. Das möchte ich tun. Werde das versuchen und die Ergebnisse posten. – TechCrunch
@ JBNizet, arbeitete wie erwartet. Ich würde dies für eine Antwort akzeptieren, wenn Sie es posten. – TechCrunch