Sometimes it is necessary for the client to start a transaction with which to execute EJB methods. In this scenario, the client has to propagate a transaction to the EJB container. To start a transaction in the client layer, first create an instance of the JNDI context and use it to acquire a UserTransaction instance. This trick should only be used with session or BMP beans. The EJB to be used should not declare its transaction level to be RequiresNew, Never, or NotSupported; anything else will work correctly (Required, Supports, or Mandatory).

public class BeanClient {
    
    public static void main(String[] args) {
        
        // first configure and retreive initial context:
        Properties props = new Properties();
        ...
                Context context = new InitialContext(props);
        
        // get the user transaction instance:
        UserTransaction transaction = (UserTransaction)
        context.lookup("java:comp/env/UserTransaction");
        
        // perform transaction:
        try {
            transaction.begin();
            
            // do something with beans:
            ...
                    
                    transaction.commit();
            
        catch (Exception e) {
            e.printStackTrace();
            transaction.rollback();
        }
    }
}