Using component-managed transactions

Using component-managed transactions

This topic describes how to enable a session bean, servlet, or application client component to use component-managed transactions, to manage its own transactions directly instead of letting the container manage the transactions.

Note: Entity beans cannot manage transactions (so cannot use bean-managed transactions).

To enable a session bean, servlet, or application client component to use component-managed transactions, complete the following steps:

  1. For session beans, set the Transaction type attribute in the component's deployment descriptor to Bean, as described in Setting transactional attributes in the deployment descriptor.

  2. For application client components, enable support for transaction demarcation by setting the Allow JTA Demarcation attribute in the component's deployment descriptor, as described in Setting transactional attributes in the deployment descriptor.

  3. Write the component code to actively manage transactions

    For stateful session beans, a transaction started in a given method does not need to be completed (that is, committed or rolled back) before completing that method. The transaction can be completed at a later time, for example on a subsequent call to the same method, or even within a different method. However, constructing the application so a transaction is begun and completed within the same method call is usually preferred, because it simplifies application debugging and maintenance. The following code extract shows the standard code required to obtain an object encapsulating the transaction context, and involves the following basic steps:

    • A javax.transaction.UserTransaction object is created by calling a lookup on "java:comp/UserTransaction".

    • The UserTransaction object is used to demarcate the boundary of a transaction by using transaction methods such as begin and commit as needed. If an application component begins a transaction, it must also complete that transaction either by invoking the commit method or the rollback method.

    Code example: Getting an object that encapsulates a transaction context

    ...
    import javax.transaction.*;
    import javax.naming.InitialContext;
    import javax.naming.NamingException;
    ...
        public float doSomething(long arg1)throws NamingException {
            InitialContext initCtx = new InitialContext();
            UserTransaction userTran = (UserTransaction)initCtx.lookup(
               "java:comp/UserTransaction");
            ...
            //Use userTran object to call transaction methods         userTran.begin ();
            //Do transactional work         ...
            userTran.commit ();
            ...
        }
        ...
    }



Related concepts
Client support for transactions

Related tasks
Developing a component to use transactions

Related reference
UserTransaction interface - methods available