Im Fall von REQUIRED
Propagierung, wenn die Aufrufer-Methode selbst transactional ist, überschreibt die aktuelle Methode umgebende Transaktionseigenschaften (zum Beispiel rollbackFor), wenn sie unterschiedlich sind?Spring @Transactional Annotation Eigenschaften Vorrang/Vererbung
Illustration:
Class A {
@Transactional(propagation = Propagation.REQUIRED,
rollbackFor = { SomeException.class})
void foo() {
try {
b.bar();
} catch (OtherException e) {
// is the transaction marked as rollback-only at this point ?
}
}
}
Class B {
@Transactional(propagation = Propagation.REQUIRED,
rollbackFor = { OtherException.class})
void bar() {
[...]
}
}
bearbeiten:
Nun möchte Ich mag out of scope Antworten zu vermeiden, trivial, also lassen Sie uns klar sein, Ich bin bewusst Federausbreitungs Handhabung.
Wenn Sie nicht, unten ist der relevante Teil der Dokumentation, ich möchte nur den ersten Teil in Bezug auf meinem obigen Beispiel verdeutlichen:
PROPAGATION_REQUIRED
Wenn die Ausbreitungseinstellung ist PROPAGATION_REQUIRED wird für jede Methode, für die die Einstellung gilt, ein logischer Transaktionsbereich angelegt. Jeder dieser logischen Transaktionsbereiche kann den Rollback-Only-Status einzeln bestimmen, wobei der äußere Transaktionsbereich logisch vom inneren Transaktionsbereich unabhängig ist. Natürlich werden von im Falle des Standardverhaltens PROPAGATION_REQUIRED alle diese Bereiche der gleichen physischen Transaktion zugeordnet. Ein Rollback-Only-Marker, der im inneren Transaktionsbereich festgelegt ist, wirkt sich also auf die Chance der äußeren Transaktion aus, tatsächlich zu committen (wie Sie erwarten würden es zu).
Jedoch in dem Fall, in dem ein inneren Transaktionsbereich setzt den Rollback-only-Marker, die äußeree Transaktion auf dem Rollback mich nicht entschieden, und so die Rollback (geräuschlos durch den inneren Transaktionsbereich ausgelöst) ist unerwartet . Eine entsprechende UnexpectedRollbackException wird an diesem Punkt ausgelöst. Dies wird Verhalten erwartet, so dass der Aufrufer einer Transaktion nie zu getäuscht werden kann davon ausgehen, dass ein Commit durchgeführt wurde, wenn es wirklich nicht war. Wenn also eine innere Transaktion (von der der äußere Aufrufer nicht Kenntnis hat) stillschweigend eine Transaktion als Rollback-only markiert, ruft der äußere Aufrufer immer noch commit auf. Der äußere Aufrufer muss UnexpectedRollbackException erhalten, um deutlich anzuzeigen, dass stattdessen ein Rollback ausgeführt wurde.
Meine Frage kann als diese neu gefasst:
Ist die logische Transaktionsbereich die Transaktionseigenschaften hält?
Sie verweisen http://stackoverflow.com/questions/ 8490852/spring-transactional-isolation-propagation/32223597 # 32223597 für verschiedene Propagierungen mit mehreren Szenarien –