要求在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用于只读方法