gpt4 book ai didi

java - EJB 中的嵌套事务行为

转载 作者:行者123 更新时间:2023-11-30 11:42:21 24 4
gpt4 key购买 nike

今天我在 EJB 中发现了一些意想不到的行为。我有带默认事务属性 (REQUIRED) 的 MDB 和带事务属性设置为 REQUIRES_NEW 的 SLSB。我的 MDB 调用 SLSB 并捕获 SLSB 可能抛出的任何异常。当 SLSB 中发生非常糟糕的事情时,将抛出 RuntimeException 的某些子类。然后,为 SLSB 创建的新事务被标记为回滚。从我的角度来看,这是一种正确的行为。然后 MDB 捕获此异常并执行一些操作(例如,将消息写入日志)并重新抛出。但是 MDB 事务不知何故也被标记为回滚,这对我来说似乎很奇怪。这种行为是否正确?

更准确地说,我可以编写一些类似于实际代码的代码来产生这种行为:

@MessageDriven
public class A{

@EJB
private B b;

@Overried
public void onMessage(Message msg){
...
try{
b.process(msg);
} catch (Throwable t){
logger.error("Something gone wrong",t);
}
...
}

SLSB 看起来像这样:

@EJB
@Stateless
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public class B{
public void process(Message msg){
...
}
}

有问题的任务流程如下所示:

  1. 调用了消息驱动 bean onMessage(Message)
  2. 消息驱动 bean 执行一些成功的操作,然后调用 B.process(Message) 方法。
  3. B 中发生错误,并引发了 RuntimeException
  4. RuntimeException 被包装在 EJBException 中,并被消息驱动的 bean 成功捕获。
  5. 消息驱动 bean onMessage(Message) 方法已完全执行,但其事务已标记为回滚

有人可以解释这种行为吗?提前致谢。

最佳答案

正如@gkuzmin 所述。

EJB 3.1 规范第 13.3.7.1 节的相关部分:

如果 bean 类有父类(super class),则适用以下附加规则。

  • 在父类(super class)S上指定的事务属性适用于S定义的业务方法。如果在S上没有指定类级别的事务属性,则等同于在S上指定TransactionAttribute(REQUIRED)。

  • 事务属性可以在类 S 定义的业务方法 M 上指定,以便为方法 M 覆盖在类 S 上显式或隐式指定的事务属性值。

  • 如果类 S 的方法 M 覆盖了 S 的父类(super class)定义的业务方法,则 M 的事务属性由上述应用于类 S 的规则确定。 p>

注意粗体部分。它不是您所期望的 S 父类(super class)的业务方法。

关于java - EJB 中的嵌套事务行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11748749/

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