Spring Data: Rollback-Transaktion bei Wiederholung

8

Es gibt eine Entität:

%Vor%

A Instanzen-Update wurde optimistisch implementiert:

%Vor%

Wie in den Kommentaren angegeben, scheint die Transaktion nicht zurückgesetzt zu werden, wenn StaleStateException auftritt. Daher wird B instance bei jeder Wiederholung gespeichert.

Ist es möglich, die Transaktion bei einem erneuten Versuch rückgängig zu machen?

Das gewünschte Verhalten ist, dass b nur bei erfolgreichem a update gespeichert wird.

    
Aliaxander 10.12.2017, 21:17
quelle

1 Antwort

7

Ich denke, es könnte etwas mit der @Retryable Konfiguration zu tun haben.

Wie der Doc sagt, Ссылка ist ein Stateless-Retryable nichts mehr als ein Zyklus, der die gleiche Methode aufruft, bis sie erfolgreich ist.

Das Problem ist, dass jedes Mal, wenn es fehlschlägt, der erste Interceptor namens retryable die Exception nicht erneut auslöst, so dass es nie @Transactional eins erreicht.

Was passiert ist also, dass jeder Wiederholungsversuch der Standardtransaktionspropagierung folgt, die dieselbe geöffnete Transaktion mit einem new B() im Kontext wiederverwenden wird.

Sie können überprüfen, ob ich beim Debugging auf der richtigen Spur bin: Wenn Sie eine zweite Wiederholung eingeben und feststellen, dass A bereits vor dem Update-Block aktualisiert wurde, dann sollte ich recht haben.

Sie können das auf zwei Arten beheben:

Teilen Sie die beiden Blöcke (versuchen Sie es zuerst mit der verschachtelten Transaktion)

%Vor%

Damit wird die Transaktion zuerst zurückgesetzt.

Oder Sie können den Dokumenten folgen und einen statusbehafteten Neuversuch Ссылка

    
Zeromus 18.12.2017, 09:29
quelle