The full picture
🎬 Transaction propagation: REQUIRED vs REQUIRES_NEW
1 / 5placeOrder() is @Transactional (default propagation = REQUIRED). No transaction exists yet, so the proxy starts TX1 and binds it to the current thread.
| Propagation | Existing TX? | No TX? | Use when |
|---|---|---|---|
| REQUIRED | join it | start one | default — one business operation, one fate |
| REQUIRES_NEW | suspend, start new | start new | must-survive records: audit, outbox-ish writes, payment attempts |
| NESTED | savepoint in same TX | start one | partial rollback of a sub-step, same commit point (JDBC only) |
| MANDATORY | join | throw | 'caller must own the TX' contracts |
| NOT_SUPPORTED | suspend, run without | run without | long reads/reporting inside transactional flows |