2016-06-10 5 views
1

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.

+1

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

+0

Ja. Das möchte ich tun. Werde das versuchen und die Ergebnisse posten. – TechCrunch

+0

@ JBNizet, arbeitete wie erwartet. Ich würde dies für eine Antwort akzeptieren, wenn Sie es posten. – TechCrunch

Antwort

-1

Bereiten Sie sich auf die übliche Frage vor: Was genau wollen Sie erreichen? Können Sie das Problem bitte noch einmal formulieren?

Es scheint, dass Sie zuerst eine zusammengesetzte Anweisung als String vorbereiten und sie am Ende aller Prüfungen einmal festschreiben können.

+1

Trace unterscheidet sich von der tatsächlichen Transaktion und sie sind verschiedene Serviceklassen. Also kann ich daraus keine zusammengesetzte Aussage machen. – TechCrunch