@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)什么时候提交?

SDR*_*yes 30 ejb jta container-managed java-ee

名为EJB的方法Aby调用另一个名为的EJB方法Bob

Bob 标有 @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)

什么时候bob交易提交?:

a)bob调用结束时

b)aby调用结束时

c)其他.什么时候?

Pet*_*sik 38

我认为A是对的.当调用方法Bob时,它会为其创建新事务,并且方法Aby将被挂起,直到Bob事务被提交.

还要注意,它必须是来自其他bean的方法才能使其成为事务性的,从同一个bean调用的方法不能充当业务方法.

有关进一步说明,请参阅此文章.

  • +1.随着我的EJB专家组帽子,我在此确认答案:)另请注意,新事务包括适用于Bob的任何拦截器(`@AnneInvoke`方法).鲜为人知的是,声明`bob`方法的类也可以声明一个`@AroundInvoke`方法,然后bean将自动成为它自己的拦截器.因此,事务在调用进入拦截器链(包括bean)之前启动,并在调用离开拦截器链时终止(提交或回滚). (14认同)
  • 只需要*真的*小心 REQUIRES_NEW 不会踩到东西 - 1)记住确保它确实是一个单一的、一次性的事务,如果失败,它不会破坏路径上的其他数据;和 2) 请记住,传递给标有 REQUIRES_NEW 的方法的任何内容将在返回之前分离对象 - 因此,如果它返回一个模型对象,它将不会附加到实体管理器。我们通常只在返回 void 的方法上调用它,只是为了自动处理情况 2 (2认同)

Mik*_*ike 6

实际上,我认为替代方案是正确的.看到:

EJB 3.0 - 嵌套事务!=需要新的吗?

我还做了一些研究,并查看db(Hyper Sonic)日志,以实际查看它何时在db中提交,并在REQUIRES_NEW方法完成时提交.但是由于处理事务的容器可能会根据容器而改变.我在调试时使用了JBoss.和Hibernate(值得一提,因为我通过检查db日志来测试它).我认为因为你询问交易而涉及数据库写入.

我的想法与之前的答案不同,所以说服会很有趣.