Rollback einer @Transactional annotiert Methode
Guten Tag. Die folgenden code:
class A{
private B b;
@Transactional
public SomeResult doSomething(){
SomeResult res = null;
try {
//do something
} catch (Exception e) {
res = b.saveResult();
}
return res ;
}
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
class B{
public SomeResult saveResult(){
//save in db
}
}
So wie ich das verstehe, wenn es eine Ausnahme in der Methode doSomething
die Transaktion nicht zurückgesetzt. Und wie zu machen, dass es gerollt? und kehrte SomeResult
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollte man nicht aufrufen, Rollback programmgesteuert. Der beste Weg, wie empfohlen von der docs, ist die Verwendung von deklarativen Ansatz. Dies zu tun, müssen Sie mit Anmerkungen zu versehen, die Ausnahmen auslösen wird, ein Rollback.
In deinem Fall, so etwas wie dieses
Werfen Sie einen Blick auf die @Transaction API und die docs über Rollback einer Transaktion.
Wenn trotz der docs Empfehlung, Sie möchten einen programmatischen rollback, dann müssen Sie es aufrufen
TransactionAspectSupport
wie bereits vorgeschlagen. Dies ist aus den docs:Kann es eine Architektur, die Fehler aber. Wenn Ihre Methode schlägt fehl, und Sie brauchen, um eine exception zu werfen, Sie sollten nicht erwarten, dass es, um etwas zurückzugeben. Vielleicht sind Sie geben zu viel Verantwortung an diese Methode und eine getrennt nur für Modell-Daten, und wirft eine exception, wenn etwas schief geht, Rollback der Transaktion. Trotzdem, Lesen Sie die Dokumentation.
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
noch eine exception wirft! Wie kann ich etwas zurückgeben von meinem Transaktions-Methode?bekommen TransactionStatus mit TransactionAspectSupport.currentTransactionStatus()
ect-Transaktions-manager, um Ihre bean versuchen aufrufen, Rollback(DefaultTransactionStatus status) in der Transaktion manager.
beziehen sich auf Frühling Dokumentation