@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 何时提交?

39
一个名为 Aby 的 EJB 方法调用另一个名为 Bob 的 EJB 方法。其中Bob 标记有 @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)。那么Bob 事务是在什么时候提交的呢? a)当Bob 调用结束时 b)当Aby 调用结束时 c)其他情况,何时提交?答案是:a)当Bob 调用结束时事务提交。
2个回答

51

我认为A是正确的。当调用Bob方法时,它会为其创建新事务,并且在Bob事务提交之前,Aby方法被挂起。

还要注意,必须使用来自其他bean的方法使其成为事务性方法,从同一bean调用的方法不起作用。

请参阅这篇出色的文章以获得进一步解释。


如果我们确认这个答案,你将成为赢家。 - SDReyes
18
穿上我的EJB专家小组帽子,我在此确认答案 :) 还要注意的是,新事务包括适用于Bob的任何拦截器(@AroundInvoke方法)。 较少人知道的是,声明bob方法的类也可以声明一个@AroundInvoke方法,然后该bean将自动成为自己的拦截器。 因此,事务在调用进入拦截器链之前就开始了(包括bean),并且在调用离开拦截器链时终止(提交或回滚)。 - David Blevins
谢谢您的评论,您让我受益匪浅 :-) - Petr Mensik
1
大家好,你们是否正确地理解了这个问题?据我所知,如果Aby调用了带有requires_new注解的Bob方法,则在恢复Aby事务之前,bob事务会被提交。这似乎与Petr Mensik的引述相符:“Aby一直被暂停,直到Bob事务被提交。”因此,答案是A而不是B。 - Gab
我同意Gab的观点。 "A"是正确答案,我认为Petr和David实际上想表达的是相同的意思。 - Peter Wippermann
2
只需要非常小心REQUIRES_NEW不要踩到东西-1)记得确保它确实是一次单独的事务,如果失败了,它不会破坏其他数据;2)记住,传递给标记为REQUIRES_NEW的方法的任何内容都将在返回之前分离对象-因此,如果它返回一个模型对象,则不会附加到实体管理器。我们通常仅在返回void的方法上调用它,以自动处理第2种情况。 - LinuxLars

6

实际上,我认为备选方案a是正确的。请参见:

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

我也进行了一些研究,并查看了 db(Hyper Sonic)日志以查看何时在 db 中提交它,当 REQUIRES_NEW 方法完成时提交。但由于容器处理事务,因此可能取决于容器而有所不同。我在调试中使用了 JBoss。还有 Hibernate(值得一提,因为我通过检查 db 日志测试了这一点)。 我假设涉及数据库写入,因为您询问事务。

我的想法与之前的回答不同,因此被说服会很有趣。


我同意,“A”是正确答案。我认为Petr Mensik的答案和David Blevins的评论实际上想表达的是一样的,但错误地写成了“B”而不是“A”。事实上,我起初也误读了正确答案,认为“B”是正确的。但我可以确认,“A”是正确的,因为我亲自验证过了。 - Peter Wippermann

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接