In an enterprise bean with container-managed transaction demarcation,
the EJB container sets the boundaries of the transactions. You can use
container-managed transactions with any type of enterprise bean: session
or message-driven. Container-managed transactions simplify development
because the enterprise bean code does not explicitly mark the
transaction’s boundaries. The code does not include statements that
begin and end the transaction. By default, if no transaction demarcation
is specified, enterprise beans use container-managed transaction
demarcation.
Typically, the container begins a transaction immediately before an
enterprise bean method starts and commits the transaction just before
the method exits. Each method can be associated with a single
transaction. Nested or multiple transactions are not allowed within a
method.
Container-managed transactions do not require all methods to be
associated with transactions. When developing a bean, you can set the
transaction attributes to specify which of the bean’s methods are
associated with transactions.
Enterprise beans that use container-managed transaction demarcation must
not use any transaction-management methods that interfere with the
container’s transaction demarcation boundaries. Examples of such methods
are the commit, setAutoCommit, and rollback methods of
java.sql.Connection or the commit and rollback methods of
javax.jms.Session. If you require control over the transaction
demarcation, you must use application-managed transaction demarcation.
Enterprise beans that use container-managed transaction demarcation also
must not use the javax.transaction.UserTransaction interface.
Transaction Attributes
A transaction attribute controls the scope of a transaction.
Figure 54-1 illustrates why controlling the scope is
important. In the diagram, method-A begins a transaction and then
invokes method-B of Bean-2. When method-B executes, does it run
within the scope of the transaction started by method-A, or does it
execute with a new transaction? The answer depends on the transaction
attribute of method-B.
Figure 54-1 Transaction Scope

A transaction attribute can have one of the following values:
-
Required
-
RequiresNew
-
Mandatory
-
NotSupported
-
Supports
-
Never
Required Attribute
If the client is running within a transaction and invokes the enterprise
bean’s method, the method executes within the client’s transaction. If
the client is not associated with a transaction, the container starts a
new transaction before running the method.
The Required attribute is the implicit transaction attribute for all
enterprise bean methods running with container-managed transaction
demarcation. You typically do not set the Required attribute unless
you need to override another transaction attribute. Because transaction
attributes are declarative, you can easily change them later.
RequiresNew Attribute
If the client is running within a transaction and invokes the enterprise
bean’s method, the container takes the following steps:
-
Suspends the client’s transaction
-
Starts a new transaction
-
Delegates the call to the method
-
Resumes the client’s transaction after the method completes
If the client is not associated with a transaction, the container starts
a new transaction before running the method.
You should use the RequiresNew attribute when you want to ensure that
the method always runs within a new transaction.
Mandatory Attribute
If the client is running within a transaction and invokes the enterprise
bean’s method, the method executes within the client’s transaction. If
the client is not associated with a transaction, the container throws a
TransactionRequiredException.
Use the Mandatory attribute if the enterprise bean’s method must use
the transaction of the client.
NotSupported Attribute
If the client is running within a transaction and invokes the enterprise
bean’s method, the container suspends the client’s transaction before
invoking the method. After the method has completed, the container
resumes the client’s transaction.
If the client is not associated with a transaction, the container does
not start a new transaction before running the method.
Use the NotSupported attribute for methods that don’t need
transactions. Because transactions involve overhead, this attribute may
improve performance.
Supports Attribute
If the client is running within a transaction and invokes the enterprise
bean’s method, the method executes within the client’s transaction. If
the client is not associated with a transaction, the container does not
start a new transaction before running the method.
Because the transactional behavior of the method may vary, you should
use the Supports attribute with caution.
Never Attribute
If the client is running within a transaction and invokes the enterprise
bean’s method, the container throws a RemoteException. If the client
is not associated with a transaction, the container does not start a new
transaction before running the method.
Summary of Transaction Attributes
Table 54-1 summarizes the effects of the transaction
attributes. Both the T1 and the T2 transactions are controlled by
the container. A T1 transaction is associated with the client that
calls a method in the enterprise bean. In most cases, the client is
another enterprise bean. A T2 transaction is started by the container
just before the method executes.
In the last column of Table 54-1, the word "None" means
that the business method does not execute within a transaction
controlled by the container. However, the database calls in such a
business method might be controlled by the transaction manager of the
database management system.
Table 54-1 Transaction Attributes and Scope
Transaction Attribute |
Client’s Transaction |
Business Method’s
Transaction |
Required
|
None |
T2 |
Required
|
T1 |
T1 |
RequiresNew
|
None |
T2 |
RequiresNew
|
T1 |
T2 |
Mandatory
|
None |
Error |
Mandatory
|
T1 |
T1 |
NotSupported
|
None |
None |
NotSupported
|
T1 |
None |
Supports
|
None |
None |
Supports
|
T1 |
T1 |
Never
|
None |
None |
Never
|
T1 |
Error |
Setting Transaction Attributes
Transaction attributes are specified by decorating the enterprise bean
class or method with a javax.ejb.TransactionAttribute annotation and
setting it to one of the javax.ejb.TransactionAttributeType constants.
If you decorate the enterprise bean class with @TransactionAttribute,
the specified TransactionAttributeType is applied to all the business
methods in the class. Decorating a business method with
@TransactionAttribute applies the TransactionAttributeType only to
that method. If a @TransactionAttribute annotation decorates both the
class and the method, the method TransactionAttributeType overrides
the class TransactionAttributeType.
The TransactionAttributeType constants shown in Table
54-2 encapsulate the transaction attributes described earlier in this
section.
Table 54-2 TransactionAttributeType Constants
| Transaction Attribute |
TransactionAttributeType Constant |
Required
|
TransactionAttributeType.REQUIRED
|
RequiresNew
|
TransactionAttributeType.REQUIRES_NEW
|
Mandatory
|
TransactionAttributeType.MANDATORY
|
NotSupported
|
TransactionAttributeType.NOT_SUPPORTED
|
Supports
|
TransactionAttributeType.SUPPORTS
|
Never
|
TransactionAttributeType.NEVER
|
The following code snippet demonstrates how to use the
@TransactionAttribute annotation:
@TransactionAttribute(NOT_SUPPORTED)
@Stateful
public class TransactionBean implements Transaction {
...
@TransactionAttribute(REQUIRES_NEW)
public void firstMethod() {...}
@TransactionAttribute(REQUIRED)
public void secondMethod() {...}
public void thirdMethod() {...}
public void fourthMethod() {...}
}
In this example, the TransactionBean class’s transaction attribute has
been set to NotSupported, firstMethod has been set to RequiresNew,
and secondMethod has been set to Required. Because a
@TransactionAttribute set on a method overrides the class
@TransactionAttribute, calls to firstMethod will create a new
transaction, and calls to secondMethod will either run in the current
transaction or start a new transaction. Calls to thirdMethod or
fourthMethod do not take place within a transaction.
Rolling Back a Container-Managed Transaction
There are two ways to roll back a container-managed transaction. First,
if a system exception is thrown, the container will automatically roll
back the transaction. Second, by invoking the setRollbackOnly method
of the EJBContext interface, the bean method instructs the container
to roll back the transaction. If the bean throws an application
exception, the rollback is not automatic but can be initiated by a call
to setRollbackOnly.
Synchronizing a Session Bean’s Instance Variables
The SessionSynchronization interface, which is optional, allows
stateful session bean instances to receive transaction synchronization
notifications. For example, you could synchronize the instance variables
of an enterprise bean with their corresponding values in the database.
The container invokes the SessionSynchronization methods
(afterBegin, beforeCompletion, and afterCompletion) at each of the
main stages of a transaction.
The afterBegin method informs the instance that a new transaction has
begun. The container invokes afterBegin immediately before it invokes
the business method.
The container invokes the beforeCompletion method after the business
method has finished but just before the transaction commits. The
beforeCompletion method is the last opportunity for the session bean
to roll back the transaction (by calling setRollbackOnly).
The afterCompletion method indicates that the transaction has
completed. This method has a single boolean parameter whose value is
true if the transaction was committed and false if it was rolled
back.
Methods Not Allowed in Container-Managed Transactions
You should not invoke any method that might interfere with the
transaction boundaries set by the container. The following methods are
prohibited:
-
The commit, setAutoCommit, and rollback methods of
java.sql.Connection
-
The getUserTransaction method of javax.ejb.EJBContext
-
Any method of javax.transaction.UserTransaction
You can, however, use these methods to set boundaries in
application-managed transactions.