Name Description
REQUIRED Uses an existing transaction and if none exists will starts a new Transaction. This is the default scope.
MANDATORY A transaction MUST already have been started. Throws TransactionRequiredException.
SUPPORTS Uses the existing transaction if one exists, otherwise the method does not run with a transaction. Used this with caution.
REQUIRES_NEW Always start a new transaction. Suspend an existing once if required.
NOT_SUPPORTED Suspends an existing transaction if required. Method runs without a transaction.
NEVER If there is an existing transaction throws an Exception. Method runs without a transaction.


REQUIRED is default

The default transaction scope when not specified is REQUIRED. This is by far the most common transaction scope used in most applications.


Example with @Transactional

We can specify other transaction scopes on methods annotated with @Transactional.

@Transactional(type = TxType.REQUIRES_NEW)
public void doInner() {
  // execute using a new transaction ...



Example with beginTransaction()

We can specify other transaction scopes via beginTransaction(TxScope).

try (Transaction transaction = database.beginTransaction(TxScope.requiresNew())) {
  // using a new transaction ...