【问题标题】:Does CDI @Transactional REQUIRES_NEW works in local methodsCDI @Transactional REQUIRES_NEW 是否适用于本地方法
【发布时间】:2015-05-24 16:40:26
【问题描述】:

在同一个 bean 中调用 CDI @Transactional(Transactional.TxType.REQUIRES_NEW) 是否有效:

@Transactional
public void method1() {
    for(...) {
        method2();
    }
}

@Transactional(Transactional.TxType.REQUIRES_NEW)
public void method2() {
   ...
}

我想它不起作用,因为代理无法拦截本地调用。 在这种情况下,如果我想在新事务中管理对 method2 的每次调用,推荐的使用模式是什么。显而易见的是创建另一个 bean,但这是我不喜欢的。

【问题讨论】:

  • 如果您可以将 EJB 用于您的控制器而不是 CDI,那么此时您会做得更好。 EJB 同样简单、更成熟,并且没有无法自引用或调用本地方法等问题。使用 EJB,您可以注入同一 bean 的 ref 或使用 EJB 会话上下文来调用本地方法。
  • @NBW 但是本地方法的问题是一样的,不是吗?解决方法是获取业务接口并调用本地方法?
  • 我想知道你为什么真的要打开另一笔交易?我在您的method1 中没有看到try/catch 如果method2 交易之一失败会怎样?围绕method1 的交易真的仍然有效吗?通常事务会给你一个全有或全无的语义,并且使用上面的代码 sn-p 我很难看到嵌套事务的好处。 FWIW,根据 SRP,您很可能仍然希望将 method2 移动到另一个 bean,尤其是如果它的价值/用例甚至证明了新事务的合理性。

标签: jakarta-ee cdi jta java-ee-7


【解决方案1】:

本地方法调用的拦截不适用于 CDI,并且您不能将类直接注入自身(循环依赖)。另见CDI call interceptor annotated method within same instance

自注入问题仍然存在,见https://issues.jboss.org/browse/CDI-414

【讨论】:

    猜你喜欢
    • 2011-05-22
    • 2019-11-18
    • 1970-01-01
    • 2020-06-12
    • 1970-01-01
    • 2014-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多