Skip to main content
Hint

This article is generated by AI translation.

Transaction Propagation

When multiple transactional methods call each other in the same thread, propagation behavior determines how transactions propagate between these methods.

Join Existing Transaction (REQUIRED)

Try to join an existing transaction; if none exists, start a new one.

  • Constant: Propagation.REQUIRED
TimeTransaction ATransaction BEffect
T1beginStart Transaction A
T2insert data1
T3beginJoin Transaction A (no-op)
T4insert data2
T5commit/rollbackNo-op (decided by outer)
T6insert data3
T7commit/rollbackCommit/rollback Transaction A

Independent Transaction (REQUIRES_NEW)

Suspend the current transaction (if any) and start a brand new independent transaction. The new transaction is unrelated to the old one.

  • Constant: Propagation.REQUIRES_NEW
info
  • Suspension means the Connection bound to the current thread becomes temporarily unavailable.
  • After suspension, the transaction manager creates a new Connection for the current thread's database connection.
TimeTransaction ATransaction BEffect
T1beginStart Transaction A
T2insert data1
T3beginSuspend A → new Connection B → start Transaction B
T4insert data2
T5commit/rollbackCommit/rollback B → resume A
T6insert data3
T7commit/rollbackCommit/rollback Transaction A

Nested Transaction (NESTED)

Create a subtransaction inside the current one using a Savepoint. Rolling back the subtransaction does not affect the outer transaction, but rolling back the outer transaction also rolls back the subtransaction.

  • Constant: Propagation.NESTED
TimeTransaction ATransaction BEffect
T1beginStart Transaction A
T2insert data1
T3beginCreate Savepoint B
T4insert data2
T5commit/rollbackRelease/rollback Savepoint B
T6insert data3
T7commit/rollbackCommit/rollback Transaction A

Follow Current Context (SUPPORTS)

If no transaction exists, run non-transactionally; if one exists, join the current transaction (same effect as REQUIRED).

  • Constant: Propagation.SUPPORTS
info

SUPPORTS essentially means do nothing — it will not actively start nor prevent a transaction.

Non-Transactional (NOT_SUPPORTED)

If no transaction exists, run non-transactionally; if one exists, suspend the current transaction and run non-transactionally.

  • Constant: Propagation.NOT_SUPPORTED
TimeTransaction ATransaction BEffect
T1beginStart Transaction A
T2insert data1
T3beginSuspend Transaction A
T4insert data2Run non-transactionally
T5commit/rollbackResume Transaction A
T6insert data3
T7commit/rollbackCommit/rollback Transaction A

Exclude Transaction (NEVER)

If no transaction exists, run non-transactionally; if one exists, throw an exception.

  • Constant: Propagation.NEVER

Require Transaction (MANDATORY)

If a transaction exists, join it; if none exists, throw an exception.

  • Constant: Propagation.MANDATORY

Propagation Behavior Comparison

PropagationNo TransactionHas Transaction
REQUIREDStart newJoin existing
REQUIRES_NEWStart newSuspend existing → start new
NESTEDStart newSavepoint subtransaction
SUPPORTSRun non-transactionallyJoin existing
NOT_SUPPORTEDRun non-transactionallySuspend existing → run non-transactionally
NEVERRun non-transactionallyThrow exception
MANDATORYThrow exceptionJoin existing