Use it when an action must survive the failure of its caller - audit rows are the usual example.
@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)); }
}
The order is rolled back.
The audit row is committed - that is the point of REQUIRES_NEW.
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