【问题标题】:Does this run in transaction?这是否在事务中运行?
【发布时间】:2010-12-03 14:19:18
【问题描述】:

假设我有两个 EJB A 和 B:

public class A implements AInterface {

    private B b;
    ...
    //This method will NOT access database directly
    public void a() {
        //do something
        b.b();
        //do something
    }
    ...
}

public class B implements BInterface {

    @TransactionAttribute(TransactionAttributeType.SUPPORTS)
    public void b() {
        //Read database
    }
}
  • A.a() 不连接数据库,而是调用 B.b()
  • B.b() 选择数据库
  • A.a() 具有默认事务属性,在此容器中是必需的

对 A.a() 的调用会在事务中运行吗?事务是在输入 A.a() 时、输入 B.b() 时、访问数据库时还是其他时间启动的?

基线是我不希望它在事务中运行,所以我可以对 A.a() 使用 NOTSUPPORTED,我猜是 (?),但我也试图理解在不同的调用堆栈点中涉及或不涉及数据库如何影响事务。

【问题讨论】:

  • 您使用什么框架来启用交易?春天?
  • 只有 EJB3 和 Weblogic。但是如果它在不同的框架中表现不同,我也想了解一下:)

标签: java transactions jakarta-ee ejb-3.0


【解决方案1】:

事务不依赖于数据库连接本身。在 EJB 中,事务不仅仅是数据库事务。一个事务可以包含多个资源(请参阅XA transactions)和多个方法调用。只有全部成功,交易才会成功。

在您的情况下,A 没有 TransactionAttribute 并按要求运行。这将在 A.a() 开始时打开一个新事务。 B.b() 的调用在 A 的事务内部运行。但是在 B.b() 完成后数据库事务没有提交。首先, A.a() 必须完成。例如,如果在调用 B.b() 后 A.a() 中出现异常,则 B.b() 将被回滚。

如果您希望 B.b() 在任何情况下都提交,我建议使用 RequiresNew 而不是 NotSupported。

您可以在Java EE Tutorial 找到所有交易属性的描述。

【讨论】:

  • 感谢您的回答。但是,B.b() 将是支持的,它不能更改,在这种情况下我不需要它提交,它只做一个 SELECT。基本上你要说的是,即使 A.a() 没有做任何“任何事情”,也存在事务开销,即。在实践中没有什么可承诺的吗? (是的,在这种情况下,如果使用事务,它将作为 XA 运行)
  • 如果你不能改变 B.b() 的事务属性并且你想在一个事务中运行它,你必须为 A.a() 使用 NotSupported。是的,如果 A.a() 具有事务属性 Required 并且 A.a() 是来自客户端的第一个调用,它将启动并负责此事务。它不会为自己提交任何资源,但会负责确保每个使用过的“资源”都可以提交。如果其中一个失败,所有这些都将被回滚。
猜你喜欢
  • 1970-01-01
  • 2022-10-05
  • 1970-01-01
  • 2012-07-18
  • 1970-01-01
  • 2013-09-30
  • 1970-01-01
  • 2015-03-30
  • 2021-09-28
相关资源
最近更新 更多