【发布时间】: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