Das Ziel besteht darin, alle / alle Transaktionen im Falle eines Fehlers rückgängig zu machen. Aber das funktioniert nicht wie erwartet.
Wir verwenden Spring MVC + JMS + Service + Mybatis. In den Protokollen ist der JMS auf Rollback gesetzt, aber die Zeile wird eingefügt und nicht zurückgesetzt. Möchten Sie wissen, was ich vermisse oder was ich falsch mache?
Das @Transactional-Tag wurde kürzlich hinzugefügt. Also nicht sicher, ob es wie erwartet funktioniert.
Code:
Serviceklasse:
%Vor%DAO:
%Vor%Frühlingskontext
%Vor%EAR / WAR-Projekt Frühlingskontext
%Vor%Protokolle:
%Vor%EDIT 1:
Controller-Code:
%Vor%DAO geändert:
%Vor%BaseDaoImpl:
%Vor%Bitte setzen Sie die transactionManager -Konfiguration und tx: annotationsgesteuerte in den Wurzelkontext
Regel: Root context can see all the beans which Spring created. Child context(any Web Context) can see only its own beans.
In diesem speziellen Fall sucht tx:annotation-driven
im Web-Kontext nach Beans mit @Transactional
Annotation. Es kann keine gefunden werden, weil Sie dataExchLogic
im Stammkontext definiert haben. Deshalb hatten Sie kein Transaktionsverhalten.
Lösung bedeutet, dass tx:annotation-driven
in den Stammkontext verschoben wird, da Root Context
jede beliebige Bean finden kann, die entweder im Stammverzeichnis oder in einem beliebigen Webkontext definiert ist.
Ich denke an zwei Möglichkeiten. 1) Ihre DAO-Klasse startet eine neue Transaktion. 2) Ihre DAO-Klasse nimmt nicht an der Transaktion teil.
Ich sehe keinen anderen Grund, warum die Daten auf die Datenbank aktualisiert werden sollten. Können Sie unter log4j die Eigenschaft hinzufügen, um zu sehen, wie viele Transaktionen gestartet werden?
%Vor%Geben Sie auch den folgenden Transaktionsstatus in der Service- und DAO-Methode an, um zu sehen, ob die Transaktion aktiv ist.
%Vor%Lassen Sie uns wissen, was passiert.
Zitat aus der Frühjahrsdokumentation:
Sie können die @ Transactional Annotation vor einer Schnittstelle platzieren Definition, eine Methode an einer Schnittstelle, eine Klassendefinition oder eine öffentliche Methode für eine Klasse. Aber die bloße Anwesenheit der @Transactional Annotation ist nicht genug, um das Transaktionsverhalten zu aktivieren. Das @Transactional Annotation ist einfach Metadaten, die von konsumiert werden können einige Runtime-Infrastruktur, die @ Transactional ist und das kann Verwenden Sie die Metadaten, um die entsprechenden Beans mit Transaktionsdaten zu konfigurieren Verhalten. Im vorherigen Beispiel wurde die Element schaltet das Transaktionsverhalten ein.
Was bedeutet,
void create(DataExch dataExch);
sollte
sein public void create(DataExch dataExch);
@Transactional
Annotationsverhalten wird nicht angezeigt, wenn es nicht auf eine öffentliche Methode angewendet wird.
BEARBEITEN:
Da meine Antwort abgelehnt wurde, um meine Antwort zu unterstützen und etwas über das Transaktionsverhalten zu erfahren, wenn eine mit Annotationen versehene Methode eine Methode ohne Annotation aufruft, sehen Sie sich dies an:
@Transactional-Methode, die eine andere Methode ohne @Transactional-Anotation aufruft? speziell die Antwort von Arun P Johny
Tags und Links spring transactions mybatis spring-jms spring-mybatis