gpt4 book ai didi

java - EJB 3 CMT 如何在没有回滚子事务的情况下回滚第一个事务?

转载 作者:行者123 更新时间:2023-11-30 11:46:22 25 4
gpt4 key购买 nike

我正在使用带有 EJB 和 CMT 事务的应用程序。我有一个 EJB(我们称它为 EJB1),其中 CMT 通过注释定义为“requires_new”,例如:

@TransactionAttribute(TransactionAttributeType.REQUIRED)

由于直到现在还没有交易,所以它创建了一个。现在,这个 EJB1 调用另一个 EJB (EJB2)。我在研究中发现的唯一创建另一个事务的方法是使用“requires_new”,例如:

@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)

完美运行,新交易已创建。问题与回滚情况有关:当 EJB2 失败时,它的事务将按预期回滚。当 EJB1 失败时,所有这些都将回滚,正如预期的那样,但不是我需要的......

我需要的是相似的,只是这个区别:当 EJB1 失败时它应该被回滚,但我希望 EJB2 在它没有失败时仍然提交。

我让我理解了吗?我不想要一个子事务,当它的父事务失败时每个事务都回滚。对于从主 EJB 调用的每个 EJB,我想要一个独立事务(如并行事务)。

最佳答案

您提到的交易属性应该在您的场景中按预期工作;如果对 EJB2 的调用成功,它将自行提交,因为它是 requires_new。但是,在这种情况下,如果在 EJB2 调用之前弹出一个未经处理的异常,它甚至可能不会被调用,给人一种一切都在回滚的印象。

如果不是这种情况,您还可以通过注入(inject) EJBContext 并调用 context.setRollbackOnly() 来控制 EJB1 中的事务。这会将当前事务标记为在完成时回滚,并且它将按您预期的方式工作。

关于java - EJB 3 CMT 如何在没有回滚子事务的情况下回滚第一个事务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9810788/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com