最好让EJB容器来管理事务,你的Session Bean需要实现一个
SessionSynchronization接口,它包括三个方法1.public void afterBegin()
                throws EJBException,java.rmi.RemoteException
  当一个新的事务开始时调用该方法,可以在方法中执行读取数据,缓存
  数据字段等功能。2.public void beforeCompletion()
                      throws EJBException,java.rmi.RemoteException
  当事务提交前调用此方法,执行写入数据等操作。3.public void afterCompletion(boolean committed)
                     throws EJBException,java.rmi.RemoteException
  事务提交后调用此方法,committed参数用于指定事务是否成功,若不成
  功则事务已回滚,否则已提交。注意:若在程序中调用了setRollBackOnly()方法,事务将会强制回滚。

解决方案 »

  1.   

    不用这么复杂吧?还要用SessionSynchronization????
      

  2.   

    这是必然的,谁要你用这个方法而不用BMP,CMP
      

  3.   

    我给一个sessionbean中使用bean管理事务的例子你参考参考吧:
    package com.softvan.session.user;import javax.ejb.*;
    import javax.transaction.*;
    import javax.naming.*;
    import javax.rmi.*;
    import java.rmi.RemoteException;import com.softvan.cmp.user.*;
    import com.softvan.cmp.info.*;public class UserSessionBean implements SessionBean
    {
      SessionContext sessionContext;
      public void ejbCreate() throws CreateException
      {
        /**@todo Complete this method*/
      }
      public void usercreate(String id,String des,String firstname,String lastname,String email,int phone) throws RemoteException
      {
        /**@todo Complete this method*/
        try
        {
          Context ct = new InitialContext();
          javax.transaction.UserTransaction tranContext = (javax.transaction.UserTransaction ) ct.lookup("javax.transaction.UserTransaction");      try
          {
            sessionContext.getUserTransaction().begin();
            Context initial = new InitialContext();
            Object  objRefUserCMPBean = initial.lookup("UserCMPBean");
            UserCMPHome usercmphome = (UserCMPHome) PortableRemoteObject.narrow(objRefUserCMPBean,UserCMPHome.class);
            try
            {
              usercmphome.create(id,des);
            }
            catch(Exception e)
            {
              e.printStackTrace(System.out);
            }        Context it = new InitialContext();
            Object  objRefInfoCMPBean = it.lookup("InfoCMPBean");
            InfoCMPHome infocmphome = (InfoCMPHome) PortableRemoteObject.narrow(objRefInfoCMPBean,InfoCMPHome.class);
            try
            {
              infocmphome.create(id,firstname,lastname,email,phone);
            }
            catch(Exception e)
            {
              e.printStackTrace(System.out);
            }
            sessionContext.getUserTransaction().commit();
          }
          catch(Exception e)
          {
            e.printStackTrace(System.out);
          }
        }
        catch(Exception e)
        {
          e.printStackTrace(System.out);
        }  }
      public void ejbRemove()
      {
        /**@todo Complete this method*/
      }
      public void ejbActivate()
      {
        /**@todo Complete this method*/
      }
      public void ejbPassivate()
      {
        /**@todo Complete this method*/
      }
      public void setSessionContext(SessionContext sessionContext)
      {
        this.sessionContext = sessionContext;
      }
    }
      

  4.   

    Stateless session bean不用SessionSynchronization,只要在配置的时候设定就行了
    SessionSynchronization这个接口是用在stateful session bean的状态持久化的。
      

  5.   

    我觉得比较可行的还是使用container管理的事务,不用涉及JTA之类的东西,代码简洁,维护较为方便。一个事务操作集中在一个session bean的方法中(因为contain事务只能界定到方法)
      

  6.   

    容器事务和用户事务各有自己的用处,这要看你的需求是什么样了。像我现在做的活,就没办法将事务放在ejb中,所以就只有调用用户的事物了。