Jakarta ee 在EJB中使用事务类型

Jakarta ee 在EJB中使用事务类型,jakarta-ee,transactions,ejb,Jakarta Ee,Transactions,Ejb,我举了以下例子: public class MyEJBService implements javax.ejb.SessionBean { public void modifyAllItems() { doSomething... for(...) { modifyItem(item); } } public void modifyItem

我举了以下例子:

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


     public void modifyItem(Item item) {
          doSomething...
     }
}
方法1=修改所有项目 方法2=修改项目


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

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

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

另一个想法是Bean管理事务,下面是步骤

  • ejb-jar.xml

    豆子

  • 代码

    公共类MyEJBService实现javax.ejb.SessionBean{
    会话语境

    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;
    }
    

  • 另一个想法是Bean管理事务,下面是步骤

  • ejb-jar.xml

    豆子

  • 代码

    公共类MyEJBService实现javax.ejb.SessionBean{
    会话语境

    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;
    }
    

  • 谢谢!现在假设我正在从EJB对象外部调用modifyAllItems(),modifyAllItems()和modifyItem()都使用默认的必需EJB事务类型。客户端没有运行任何事务,因此在调用modifyAllItems()时将启动一个新事务。为什么EJB在modifyItem时决定使用相同的事务()是从modifyAllItems()内部调用的?我的意思是,如果服务是从同一EJB对象内的另一个服务内部调用的,EJB事务类型配置是否重要?谢谢!现在想象一下,我是从该EJB对象外部调用modifyAllItems(),同时调用modifyAllItems()和modifyItem()需要使用默认的EJB事务类型。客户端未运行任何事务,因此在调用modifyAllItems()时将启动新事务。为什么EJB在从modifyAllItems()内部调用modifyItem()时决定使用相同的事务?我的意思是,如果从同一EJB对象内的另一个服务中调用服务,EJB事务类型配置是否重要?也可以在EJB3规范中使用@TransactionManagement(TransactionManagementType.BEAN)注释。也可以使用@TransactionManagement(TransactionManagementType.BEAN)EJB3规范中的注释。