要求在REQUIRES_NEW内的REQUIRES_NEW内……等等

JBoss 4.x
EJB 3.0

我见过如下代码(大大缩写):

@Stateless @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED) public class EJB1 implements IEJB1 { @EJB private IEJB1 self; @EJB private IEJB2 ejb2; @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) public boolean someMethod1() { return someMethod2(); } @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) public boolean someMethod2() { return self.someMethod3(); } @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) public boolean someMethod3() { return ejb2.someMethod1(); } } 

并且说EJB2几乎是EJB1的精确副本(相同的三种方法), EJB2.someMethod3()调用EJB3.someMethod1() ,然后最终在EJB3.someMethod3()写入DB。

这是一个人为的例子,但在我们的代码库中看到了类似的代码。 代码实际上工作得很好。

但是,这感觉就像是一种糟糕的做法,我担心@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)在每个甚至没有实际执行任何数据库写入的方法上。 这是否实际上每次为每个方法调用创建一个新事务,结果为:

新交易
– 新交易
– 新交易
—新交易
…(还有很多)
——-新的transaciton(DB写)

然后在那个时候解开? 这会不会引起性能问题? 额外的想法?

这是否实际上每次为每个方法调用创建一个新事务

不,它没有。 只有在通过另一个bean的EJB引用调用方法时,才会创建新事务。 从同一个bean中的method1调用method2将不会生成新事务。

另见此处和此处 。 后者是非常好的文章,解释了EJB中的事务管理。

编辑:
感谢@korifey指出,该方法2实际上在bean引用上调用method3,从而导致新的事务。

它确实在每个EJB中创建了新的JTA事务,这必须对只读方法产生严重的性能影响(这只会产生SELECTS,而不是更新)。 将@SUPPORTS用于只读方法