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

Posted

技术标签:

【中文标题】@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 何时提交?【英文标题】:When does @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) commit? 【发布时间】:2012-07-21 19:07:44 【问题描述】:

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

Bob 标有@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)

bob 事务何时提交?:

a) 当bob 调用结束时

b) 当aby 调用结束时

c) 其他。什么时候?

【问题讨论】:

【参考方案1】:

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

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

查看这个伟大的article 以获得进一步的解释。

【讨论】:

如果我们确认这个答案,您将成为赢家 +1。带着我的 EJB 专家组的帽子,我在此确认答案:) 另请注意,新事务包括适用于 Bob 的任何拦截器(@AroundInvoke 方法)。鲜为人知的是,声明bob 方法的类也可以声明@AroundInvoke 方法,然后bean 会自动成为自己的拦截器。因此事务在调用进入拦截器链(这包括 bean)之前开始,并在调用离开拦截器链时终止(提交或回滚)。 感谢您的评论,您拓宽了我的智慧:-) 伙计们,您是否正确阅读了这个问题?据我了解,如果 Aby 调用用 requires_new 注释的 Bob 方法,则在恢复 aby 事务之前会提交 bob 事务。这似乎与 Petr Mensik 的引用“Aby 被暂停,直到 Bob 事务提交”一致。所以答案是 A,而不是 B。 只需要真正小心 REQUIRES_NEW 不会踩到东西 - 1) 记住确保它确实是一个单一的一次性事务,如果失败,它不会破坏路径中的其他数据;和 2) 请记住,传递给标有 REQUIRES_NEW 的方法的任何内容都会在返回之前分离对象 - 因此,如果它返回模型对象,它将不会附加到实体管理器。我们通常只在返回 void 的方法上调用它,只是为了自动处理案例 2【参考方案2】:

实际上,我认为替代 a 是正确的。见:

EJB 3.0 - Nested Transaction != Requires New?

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

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

【讨论】:

我同意,“A”是正确答案。我认为 Petr Mensik 的回答和 David Blevins 的评论实际上打算说同样的话,但错误地写了“B”而不是“A”。实际上,即使我一开始就误读了正确答案,并认为“B”是正确的。但我可以确认“A”是正确的,因为我自己检查过。

以上是关于@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 何时提交?的主要内容,如果未能解决你的问题,请参考以下文章

在提交之前不会通过查询检索持久化实体

提取TRA文件的TRA配置

vbscript WMI - 获取事件日志tra截止日期

text Confronto报告anche tra ambienti diversi SE39

数据库使用数据泵迁移遇到LOB字段

谁知道TRA是啥意思吗?