2016-11-25 2 views
0

In der Spring-basierten Anwendung ist der Transaction Manager für das Commit oder Rollback von SQL-Transaktionen verantwortlich. Meine Anwendung verwendet einen benutzerdefinierten Cache für einen Teil der persistenten Daten. Dieser Cache wird weder von Spring noch von Hibernate verwaltet.Wie kann Anwendung benachrichtigt werden, wenn Spring Transaction Manager eine SQL-Transaktion Rollbacks?

Wenn eine SQL-Transaktion auf Fehler stößt und ein Rollback durchgeführt werden muss, sollten Cache-Änderungen ebenfalls rückgängig gemacht werden.

Meine Frage ist, wie ein Ereignis Listener oder Callback, die meine cache.evict() Methode aufrufen, wenn Spring Transaction Manager eine Transaktion zurücksetzt, zu registrieren?

Antwort

2

Sie können hierfür TransactionSynchronizationAdapter verwenden. Als Referenz können Sie sich das ansehen: Spring - commit JMS Transaction after JPA transaction

In der Antwort in der Verbindung angegeben ist die Synchronisation für afterCommit registriert. In Ihrem Fall wäre es afterCompletion. In dieser Implementierung müssen Sie prüfen, ob sich die Transaktion in einem Rollback-Status befindet, und die Cache-Räumung durchführen.

+0

Ich würde es nicht so tun ... es sieht aus wie Sie es jedes Mal hinzufügen müssen ... => Code wiederholen – Alex

+0

Danke ritesh.garg, ich werde das versuchen –

0

Es gibt viele Möglichkeiten, dies zu tun ...

  1. Sie Anwendungsereignisse verwenden können, wenn Sie wollen ... Application Events in Spring Framework 4.2
  2. Sie können eine benutzerdefinierte Laufzeit Ausnahme auslösen und Sie können damit umgehen in Ihrem Exception-Handler (wenn Sie Feder-MVC verwenden). aber hier rate ich nicht, irgendwelche wichtigen Operationen wie Löschen von Cache hier zu tun ... Exception handling in Spring MVC
  3. Sie können eine Kombination von # 1 und # 2 verwenden. Sie können ein Ereignis senden, das eventuell eine Laufzeitausnahme auslöst, die Sie in der Benutzeroberfläche behandeln (spring mvc oder was auch immer Sie verwenden). Dies ist, wie ich würde es tun
  4. Sie eine Ausnahme auslösen kann und jeder Bean Aufruf wird die benutzerdefinierte Transaktion Ausnahme Sie erhalten und wird mit der Meldung zu tun haben ... Ich empfehle nicht, dieses
+0

Leider wird dieser Ansatz nicht für mich arbeiten, weil ich diesen Teil einer Anwendung, der Ausnahmen auslöst, nicht kontrolliere. Tatsächlich ist mein Code eine Bibliothek (JaVers), die von einer Anwendung verwendet wird. Daher muss ich vom Transaktionsmanager der Anwendung benachrichtigt werden, wenn ein Rollback auftritt –

Verwandte Themen