Transaktion nur abfangen, wenn sicher ist, dass sie festgeschrieben wird, aber bevor sie festgeschrieben wird

Context ist Java - JPA mit Hibernate und Spring.

Nehmen wir das Szenario eines zweiphasigen Festschreibungsprotokolls (jedoch nur mit einer Ressource):

Query, die von der Anwendung übernommen werden soll

Vote Ja / Nein (in unserem Fall aus der Datenbank)

3.1. Wenn ja aus der Datenbank

3.1.1. Rückruf im Code) - nicht Teil des Protokolls

3.1.2. Commit to database

3.2 Wenn nein

3.2.1 Rollback zur Datenbank

Was ich möchte, ist eine Möglichkeit, den Rückruf von 3.1.1 im Code auszuführen, aber nur, wenn bekannt ist, dass die Transaktion festgeschrieben wird, aber vorher tatsächlich festgeschrieben wird. Wenn hier eine Ausnahme ausgelöst wird, sollte die Transaktion zurückgesetzt werden.

UsingTransactionSynchronizationit @ (*) aus Spring können Sie eine Transaktion abfangen, bevor sie festgeschrieben / abgeschlossen wurde oder nachdem sie festgeschrieben / abgeschlossen wurde.

beforeCommit() callback besagt, dass nach dem Aufruf der Methode immer noch ein Rollback stattfinden kann;beforeComplete() wird aufgerufen, auch wenn die Transaktion fehlschlägtafterCommit/Complete() wird aufgerufen, nachdem die Transaktion tatsächlich für die Datenbank festgeschrieben wurde und ein Rollback nicht möglich ist.

Nun wie ich aussehe, ist das, was ich möchte, ein anderes in einem vollständigen Zwei-Phasen-Festschreibungsprotokoll. aber ich frage mich, ob es im Frühjahr eine Problemumgehung gibt. Der Unterschied besteht darin, dass der im Rückruf getätigte Anruf nicht rückgängig gemacht werden kann.

(*) von Spring 4.2 ist sehr einfach mit@TransactionalEventListener undTransactionPhase die schön abstrahiertTransactionSynchronization

Antworten auf die Frage(4)

Ihre Antwort auf die Frage