Picking up between "join" and "start fresh"
Part 1 left you with two propagation modes and a clean way to think about them. REQUIRED joins whatever transaction is already running, so everything shares one all-or-nothing boundary. REQUIRES_NEW ignores the outer transaction, suspends it, and runs a completely separate one that commits or fails on its own.
Those two are opposites. Join everything, or share nothing. But real code sometimes wants something in between: let the inner work fail and be undone on its own, yet still tie its success to the outer transaction's success. Neither mode gives you that. REQUIRED can't undo just the inner part; REQUIRES_NEW commits the inner part too early.
The mode that fills that gap is NESTED, and it works with a database feature called a savepoint. So before we can name NESTED, we have to build a savepoint.
What a savepoint is






