0 Tage Serie
java / intermediate
Snippet

Bedingte programmatische Rollback-Steuerung über TransactionAspectSupport

Deklarative Spring-Transaktionen (`@Transactional`) führen standardmäßig nur bei ungeprüften RuntimeExceptions ein Rollback durch. Wenn die Geschäftslogik ein Rollback ohne das Werfen einer Exception erfordert – beispielsweise um ein strukturiertes Domain-Ergebnis bei Betrugsverdacht zurückzugeben –, markiert der Aufruf von `TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()` die aktive Transaktion im Kontrollfluss gezielt als 'Rollback-Only'.

snippet.java
java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@Service
public class PaymentProcessingService {
private final LedgerRepository ledgerRepository;
private final ExternalPaymentGateway paymentGateway;
@Transactional
public ProcessingResult processTransaction(PaymentRequest request) {
LedgerEntry entry = ledgerRepository.save(new LedgerEntry(request.getAmount()));
GatewayResponse response = paymentGateway.charge(request.getPaymentMethod(), request.getAmount());
if (response.getStatus() == GatewayStatus.SUSPECTED_FRAUD) {
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return ProcessingResult.flaggedForReview(entry.getId(), response.getReason());
}
entry.markSettled(response.getTransactionId());
return ProcessingResult.success(entry.getId());
}
}
spring
Erklärung
1
@Transactional
Öffnet eine verwaltete Datenbanktransaktionsgrenze für die gesamte Methodenausführung.
2
if (response.getStatus() == GatewayStatus.SUSPECTED_FRAUD) {
Prüft die Bedingung der Geschäftslogik, die einen Abbruch der Datenpersistierung erfordert.
3
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
Weist den Spring TransactionManager an, die Transaktion beim Methodenende zurückzurollen, ohne eine Exception zu werfen.
4
return ProcessingResult.flaggedForReview(entry.getId(), response.getReason());
Ermöglicht der Methode die Rückgabe eines regulären Ergebnisobjekts trotz Datenbank-Rollbacks.