Spring Service @Transactional rollt die Transaktion Mybatis SqlSession nicht zurück

8

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%     
Harry 07.03.2017, 14:51
quelle

3 Antworten

4

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.

  

@EnableTransactionManagement und sucht nur nach @Transactional für Beans im selben Anwendungskontext, in dem sie definiert sind. Wenn Sie also eine annotierungsgesteuerte Konfiguration in einem WebApplicationContext für ein DispatcherServlet einfügen, sucht es nur nach @Transactional-Beans in Ihren Controllern und nicht nach Ihren Services. Weitere Informationen finden Sie in Abschnitt 21.2, "DispatcherServlet".

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.

    
shevchyk 10.03.2017, 23:12
quelle
2

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.

    
VimalKumar 11.03.2017 19:56
quelle
1

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

    
ritesh.garg 09.03.2017 21:04
quelle