一个事务就rollback吧
如果不是一个事务就commit了

解决方案 »

  1.   

    楼上的朋友,您的答案不是我想要的...
    我上来已经说明了,是SessionBean, Transaction为Required,CMP 。
    不是用UserTransaction。
      

  2.   

    commit因为对于CMP session bean你必须通过setRollbackOnly()或者EJBException莱通知容器rollback
    Exception不行的,抛EJBException看看
      

  3.   

    楼上的朋友,我按照你说的两个方法改了所写的SessionBean,但是....结果还是commit了,
    修改后方法如下:public void test()throws RemoteException,Exception{
      try{
        getConnection ...
        
        execute sql1;    execute sql2;  }
      catch(Exception ex){
        System.out.println(ex.toString());
        this.context.setRollbackOnly();            
        throws new EJBException("test");
      }
    }
      

  4.   

    我现在就是碰到这个问题,为什么第一句sql就是不rollback,而且在CMP的SessionBean 中是不能再声明UserTransaction来控制transaction的,会报错,郁闷啊郁闷.....
      

  5.   

    public void test()throws RemoteException,Exception{
      try{
        getConnection ...
        
        execute sql1;    execute sql2;  }
      catch(EJBException ex){
        System.out.println(ex.toString());
        this.context.setRollbackOnly();            
        throws ex;  }
    }试试行不行.
      

  6.   

    catch(Exception ex){
        System.out.println(ex.toString());
        this.context.setRollbackOnly();            
      }
    或者
      catch(Exception ex){
        System.out.println(ex.toString());
        throws new EJBException("test");
      }
    都行
        
    另外,你的connection怎么拿的?是从容器lookup的么?
      

  7.   

    我的connection是这样得到的:
        public static Connection getConnection(String ejbJdbcLocation)throws Exception{
            Context ic = new InitialContext();
            DataSource ds = (DataSource) ic.lookup(ejbJdbcLocation);
            return ds.getConnection();
        }从容器中get的....
    另外在sun 的j2ee tutorial上,对CMP的SessionBean怎样控制transaction的,只字未提。
    对CMP的EntityBean倒是提到了。
      

  8.   

    SessionBean不是持久对象本来就没有CMP这一说,我猜你说的是CMT如果你确定你的connection是从容器获得的,而且两个操作用的同一个connection,只能怀疑你的数据库不支持事物(比如Access)或者你的ejb部署的不对
      

  9.   

    <session>
          <description>Session Bean ( Stateless )</description>
          <display-name>AdapterEJB</display-name>
          <ejb-name>AdapterEJB</ejb-name>
          <home>tw.com.synergy.ehs.ejb.AdapterEJBHome</home>
          <remote>tw.com.synergy.ehs.ejb.AdapterEJB</remote>
          <ejb-class>tw.com.synergy.ehs.ejb.AdapterEJBBean</ejb-class>
          <session-type>Stateless</session-type>
          <transaction-type>Container</transaction-type>
        </session>现在我比较倾向你所说的,SessionBean根本没有CMP这一说;
    不过你看我给出的ejb-jar.xml,里面的的确确有这么一行:
    <transaction-type>Container</transaction-type>
    这样说的话,这行写不写都一样了....sun公司的SessionBean例子都有这行。我提这个问题是因为:
    我用过.Net的Http WebService,也可以设置TransactionType,如果设置为Required,每当一个方法中的exception不能在本层中处理并抛出时,那么这个方法中的sql操作全部rollback。 所以我就想当然的,以为SessionBean应该和.Net的WebService差不多。 只要一个方法中exception为处理并抛出,那么这个方法中的所有sql都rollback,谁知.... 我只能评价:so weak, so unfriendly。
      

  10.   

    <transaction-type>Container</transaction-type>
    这行表示事物界定由容器决定,Container Managed Transaction,如果你的session bean有数据库/JMS/JCA事物,那么事物的边界和提交回滚控制是容器自动完成,你只需要用setRollbackOnly或者EJBException来通知容器回滚. 
    CMP和CMT两码事,CMP是定义持久化的,只有entity bean才有这个概念, 你对CMT/BMT/CMP/BMP的概念还需要更清楚一下。
    EJB CMT之所以和.NET web service transaction处理方式不同是因为EJB要留给用户更多的灵活控制的能力,考虑起来是要复杂繁琐的多,这没办法,你看看容器生成session bean,.NET设计师是Anders,他有Delphi情怀,运行平台是Windows, 所以.net当然是偏RAD风格的,Java这边都是SUN IBM Oracle阵营的,设计更高考虑架构分层负载方面,学习实施起来肯定要慢的。
      

  11.   

    spring+hibernate+struts技术论坛群9967568,真诚欢迎各位喜好的朋友来学习论坛