Sobes.tech
Senior

What is propagation in @Transactional and why is it needed?

sobes.tech AI

Answer from AI

Propagation in the @Transactional annotation manages the behavior of transactions when one transactional method calls another. It is necessary to control how the current transaction should behave: create a new one, use an existing one, suspend, or throw an exception if a transaction already exists.

Main types of propagation:

  • REQUIRED (default) — use the current transaction if it exists, otherwise create a new one.
  • REQUIRES_NEW — always create a new transaction, suspending the existing one.
  • SUPPORTS — use a transaction if it exists, otherwise work without a transaction.
  • MANDATORY — use an existing transaction, throw an exception if none exists.
  • NOT_SUPPORTED — work without a transaction, suspending any existing one.
  • NEVER — work without a transaction, throw an exception if a transaction exists.
  • NESTED — create a nested transaction if supported.

Example:

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void saveData() {
    // This method will always execute in a new transaction,
    // regardless of whether there is an external transaction.
}

This is necessary for precise control of transaction boundaries, ensuring data integrity, and proper error handling in complex business processes.