Spring: Propagation.REQUIRES_NEW suspends the outer transaction

Use it when an action must survive the failure of its caller - audit rows are the usual example.

Code
@Transactional
public void process(Order o) {
    audit.record(o);      // REQUIRES_NEW - commits on its own
    throw new IllegalStateException("processing failed");
}

@Service
class Audit {
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void record(Order o) { auditRepo.save(new AuditRow(o)); }
}
Output
The order is rolled back.
The audit row is committed - that is the point of REQUIRES_NEW.
Advertisement

Run this yourself in the Online Java Compiler, spin up a live REST API in the API Sandbox, or practise with Java interview questions.

Published 2026-08-11