gpt4 book ai didi

java - 事务回滚后调用非事务方法

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

我刚刚发现一些 EJB 行为,这对我来说看起来相当令人惊讶。

这里是代码示例(确保 MyBean、beanA、beanB 是使用 CMT 的 EJB):

@Stateless
public class MyBean {
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void myMethod(){
try {
beanA.methodA(); /* annotated as REQUIRED */
} catch (Exception e) {
beanB.methodB(); /* annotated as NOT_SUPPORTED */
}
}
}

假设 methodA 的执行时间超过了事务超时时间,因此一旦它返回,myMethod 就会收到 TransactionRolledbackException,然后在“myMethod”中成功捕获该异常。

到目前为止,我希望调用“methodB”,因为根据 EJB 规范,必须在没有任何事务上下文的情况下调用它。但实际上,“beanB”代理只是返回另一个 TransactionRolledbackException,“methodB”并未执行。

纵观 EJB 规范,我没有看到任何东西可以证明容器应该甚至可能会这样做。

我错过了什么吗?任何提示将不胜感激。

更新

至少对于 Websphere,此行为似乎是特定于超时的。例如,当“methodA”抛出 RuntimeException 时设置的“rollbackOnly”标志不会阻止“methodB”执行。只有超时标志可以。

最佳答案

EJB 规范没有专门解决这种情况,只是指出一旦事务被标记为回滚,那么“继续事务是没有结果的”,并且对于 的处理NOT_SUPPORTED,规范指出“没有规定容器应如何管理具有未指定事务上下文的方法的执行”。

WebSphere Application Server 的所有版本都采取了这样的方法:处理 EJB 方法仅标记为回滚的场景的最佳方法是阻止容器控制的所有进一步操作,以便可以回滚事务尽快返回,保证资源的及时释放(比如数据库锁)。允许调用 NOT_SUPPORTED EJB 方法将导致标记为回滚的事务被挂起;从而继续保留可能阻止或已经阻止其他事务的资源。因此,WebSphere 阻止此类 Activity 。

关于java - 事务回滚后调用非事务方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49326531/

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