【问题标题】:Working with Transaction Types in EJB在 EJB 中使用事务类型
【发布时间】:2013-04-18 19:47:10
【问题描述】:

我有以下例子:

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 完成之前出现异常,数据库没有返回到以前的状态 - 回滚)。这种行为是预期的吗?我有点困惑。非常感谢。

【问题讨论】:

    标签: jakarta-ee transactions ejb


    【解决方案1】:

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

    【讨论】:

    • 谢谢!现在想象一下,我正在从这个 EJB 对象外部调用 modifyAllItems(),并且 modifyAllItems() 和 modifyItem() 都使用默认的 EJB 事务类型Required。客户端没有运行任何事务,因此在调用 modifyAllItems() 时将启动一个新事务。当从 modifyAllItems() 内部调用 modifyItem() 时,为什么 EJB 决定使用相同的事务?我的意思是,如果服务是从同一个 EJB 对象内的另一个服务中调用的,那么 EJB 事务类型配置是否重要?
    【解决方案2】:

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

    1. ejb-jar.xml

      Bean

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

    【讨论】:

    • 也可以在 EJB3 规范中使用 @TransactionManagement(TransactionManagementType.BEAN) 注解。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-12
    • 1970-01-01
    • 2018-09-05
    • 2015-04-06
    相关资源
    最近更新 更多