0 Tage Serie
java / intermediate
Snippet

Kompensierende Aktionen bei Transaktions-Rollbacks mittels TransactionPhase

Wenn eine Transaktionsmethode fehlschlägt und zurückgerollt wird, werden alle Operationen innerhalb dieser Transaktion verworfen. Mit @TransactionalEventListener und TransactionPhase.AFTER_ROLLBACK lassen sich Kompensationslogiken, Bereinigungen oder persistente Fehlerprotokolle nach dem Scheitern ausführen, ohne den primären Transaktionskontext zu belasten.

snippet.java
java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@Component
public class PaymentAuditLogger {
private final AuditLogRepository auditLogRepository;
public PaymentAuditLogger(AuditLogRepository auditLogRepository) {
this.auditLogRepository = auditLogRepository;
}
@Async
@TransactionalEventListener(phase = TransactionPhase.AFTER_ROLLBACK)
public void handlePaymentFailure(PaymentFailedEvent event) {
AuditRecord failureRecord = new AuditRecord(
event.orderId(),
event.reason(),
event.timestamp()
);
auditLogRepository.save(failureRecord);
}
}
spring
Erklärung
1
@Async
Führt den Event-Listener in einem separaten Thread-Pool aus, um den Aufrufer beim Rollback nicht zu blockieren.
2
@TransactionalEventListener(phase = TransactionPhase.AFTER_ROLLBACK)
Konfiguriert den Listener so, dass er ausschließlich bei fehlgeschlagener und zurückgerollter Transaktion auslöst.
3
public void handlePaymentFailure(PaymentFailedEvent event)
Empfängt das typsichere Fehler-Event, das während der fehlgeschlagenen Operation ausgelöst wurde.
4
auditLogRepository.save(failureRecord);
Persistiert Fehlerdetails unabhängig in einer neuen, eigenständigen Datenbanktransaktion.