Vor kurzem habe ich eine Situation gestoßen, in der die Transaktion nicht zurückrollt. Ich habe auch darüber nachgedacht, dass es in den Transaktionen von JPA Fehler gibt? Ich denke zu viel ...
Um die Protokolle klar zu drucken, füge ich Tyrcatch hinzu, um die Protokolle im Fang zu drucken. Aber die Situation hier kommt. Wenn diese Methode abnormal ist, wird das Protokoll gedruckt, die zusätzliche Transaktion wird jedoch nicht zurückgeworfen.
Beispiel:
Methoden wie diese werden nicht rollen (eine Methodenfehler, die andere Methode wird nicht rollen):
if (userave) {try {userDao.save (user); userCapabilityquotadao.save (Capabilityquota); } catch (Ausnahme e) {logger.info ("Fähigkeit, die Schnittstelle zu öffnen, Ausnahme von Kontoeröffnungen, Ausnahmeinformationen:"+e); }}Die folgende Methode rollt zurück (eine Methodenfehler, die andere Methode rollt zurück):
if (userave) {try {userDao.save (user); userCapabilityquotadao.save (Capabilityquota); } catch (Ausnahme e) {logger.info ("Fähigkeit, die Schnittstelle zu öffnen, Ausnahme von Kontoeröffnungen, Ausnahmeinformationen:"+e); neue runimeexception () werfen; }}oder:
if (userave) {try {userDao.save (user); userCapabilityquotadao.save (Capabilityquota); } catch (Ausnahme e) {logger.info ("Fähigkeit, die Schnittstelle zu öffnen, Ausnahme von Kontoeröffnungen, Ausnahmeinformationen:"+e); TransactionaspectSupport.currentTransactionStatus (). SetRollbackonly (); }}Warum kannst du nicht raus? ? Es versteht den Transaktionsmechanismus des Frühlings nicht. ! !
***** Die Standard -Spring -Transaktion wird nur zurückgerollt, wenn ein ungekordenes RunTimeExcetpion auftritt. *******
Das Prinzip der Springaop -Ausnahmeerfassung: Die abgefangene Methode muss eine Ausnahme explizit auswerfen und in keiner Weise verarbeitet werden. Auf diese Weise kann der AOP -Agent die Ausnahme der Methode fangen und zurückrollen. Standardmäßig fängt AOP nur die Ausnahme der RunTimeException auf, kann aber passieren.
Konfigurieren Sie, um bestimmte Ausnahmen zu fangen und zurückzurollen
Mit anderen Worten, verwenden Sie Trycatch in der Service -Methode nicht oder fügen Sie WorfowruntimeExcetpion () zum Fang hinzu, damit das Programm von AOP gefangen und zurückgerollt werden kann, wenn das Programm außergewöhnlich ist.
Lösung:
Lösung 1. Wenn beispielsweise die Serviceschicht Transaktionen abwickelt, führt die Methode im Dienst keine Ausnahmeregelung durch oder fügt der Catch -Anweisung eine Anweisung von WurstewruntimeException () hinzu, so dass AOP die Ausnahme fängt und dann die obere Layer (WebService -Client, Layer Action) weiterhin die Ausnahme fangen und verarbeiten muss.
Lösung 2. Fügen Sie die: transactionaspectSupport.currentTransactionStatus (). SetRollbackonly () hinzu; Anweisung zur Catch -Anweisung der Service -Layer -Methode, manuell rollback, damit die obere Ebene keine Ausnahmen verarbeiten muss (die aktuelle Projektpraxis)
Zusammenfassen
Das obige ist der gesamte Inhalt dieses Artikels über die Analyse der Rollback -Instanzen der Spring -Transaktionsausnahme. Ich hoffe, es wird für alle hilfreich sein. Interessierte Freunde können weiterhin auf andere verwandte Themen auf dieser Website verweisen. Wenn es Mängel gibt, hinterlassen Sie bitte eine Nachricht, um darauf hinzuweisen. Vielen Dank an Freunde für Ihre Unterstützung für diese Seite!