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
@Servicepublic class PaymentProcessingService {private final LedgerRepository ledgerRepository;private final ExternalPaymentGateway paymentGateway;@Transactionalpublic 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.