Springs @Transactional führt bei geprüften Ausnahmen kein Rollback durch
Wir verwenden das Spring Framework in den meisten unserer Anwendungen (und damit auch in der Cloudflight Platform) und sind sehr zufrieden damit.
Einer der großen Vorteile ist das deklarative Transaktions-Handling mit dem @Transactional-Attribut.
import org.springframework.transaction.Transactional;
@Transactional
public class MyService implements IMyService {
public List getResults () {
// do something
}
public void foo() {
throw new java.lang.UnsupportedOperationException();
}
public void bar() {
throw new java.lang.Exception();
}
}
Diese einfache Annotation an einer von einem Spring-ApplicationContext verwalteten Klasse bewirkt, dass alle Methodenaufrufe an diesen Service an eine Transaktion gebunden werden. Die Transaktion wird nach dem Verlassen des Service durch den Methodenaufruf committed, und sie wird zurückgerollt, wenn eine Ausnahme geworfen wird (z. B. nach dem Aufruf der – zugegebenermaßen unsinnigen – Methode foo()).
Aber Vorsicht: Standardmäßig wird nur bei ungeprüften Ausnahmen (also Unterklassen von java.lang.RuntimeException) ein Rollback durchgeführt. Wenn eine geprüfte Ausnahme geworfen wird, wird die Transaktion committed!
Die Spring-Dokumentation erklärt das wie folgt:
Während das EJB-Standardverhalten darin besteht, dass der EJB-Container bei einer System-Exception (normalerweise eine Runtime-Exception) automatisch ein Rollback der Transaktion durchführt, führt EJB-CMT bei einer Anwendungs-Exception (also einer geprüften Ausnahme, die keine java.rmi.RemoteException ist) kein automatisches Rollback durch. Obwohl das Spring-Standardverhalten für das deklarative Transaktions-Management der EJB-Konvention folgt (Rollback erfolgt automatisch nur bei ungeprüften Ausnahmen), ist es oft sinnvoll, dieses Verhalten anzupassen.
Und diese Anpassung kann sehr einfach vorgenommen werden, indem dem @Transactional-Attribut der Parameter rollbackFor hinzugefügt wird:
import org.springframework.transaction.Transactional;
@Transactional(rollbackFor = Exception.class)
public class MyService implements IMyService {
public List getResults () {
// do something
}
public void foo() {
throw new java.lang.UnsupportedOperationException();
}
public void bar() {
throw new java.lang.Exception();
}
}
In diesem Fall wird die Transaktion auch bei einem Aufruf der Methode bar() zurückgerollt.
Agent Hub
Gehen Sie über vereinzelte AI-Piloten hinaus und schaffen Sie eine sichere, skalierbare Grundlage für Agentic AI in Ihrer gesamten Organisation.
Zur Demo




