0

我有以下示例:

public class MyEJBService implements javax.ejb.SessionBean {
      public void modifyAllItems() {
           doSomething...
           for(...)
           {
                modifyItem(item);
           }
      }


     public void modifyItem(Item item) {
          doSomething...
     }
}

方法 1 = modifyAllItems 方法 2 = modifyItem

Method1 多次调用 method2。我想在method1禁用事务,但在method2启用事务。method2 的每次调用都应该在不同的事务中(如果在修改项目时发生错误,则可能已修改某些项目而其他项目保持不变)。我已经为 method1() 定义了一个 EJB 事务类型——从不,另一个为 method2()——需要新的。问题是,当我调用 method2() 时,EJB 似乎没有创建任何事务,因为当 method2() 内部发生错误时它不会回滚(如果在 method2 内部的数据库中发生了某些更改但它抛出在方法 2 完成之前出现异常,数据库没有返回到以前的状态 - 回滚)。这种行为是预期的吗?我有点困惑。非常感谢。

4

2 回答 2

2

是的,这是预期的行为,因为事务是使用代理实现的,因此仅在从第三方对象完成对 EJB 方法的调用时才应用。如果您希望在从 method1() 调用时应用 method2() 事务,则必须将其移动到第二个 EJB 对象。

于 2013-04-19T06:49:06.473 回答
1

另一个想法是 Bean Managed Transaction,以下是步骤

  1. ejb-jar.xml

    <transaction-type>Bean</transaction-type>

  2. 编码

    公共类 MyEJBService 实现 javax.ejb.SessionBean {
    SessionContext 上下文;

    public void modifyAllItems() 
    {
        doSomething();
         for(...)
         {
             UserTransaction  trans=context.getUserTransaction();;
             try
             {
              trans.begin();
              modifyItem(item);
              trans.commit();
             }catch(Exception  e)
             {
                 trans.rollback();//if need propagation then:trans.setRollbackOnly();
             }
         }
    }
    
    public void modifyItem(Item item) {
        doSomething();
    }
    
    @Override
    public void setSessionContext(SessionContext context) throws EJBException,
            RemoteException {
        this.context = context;
    }
    
于 2013-04-19T23:57:02.430 回答