要求在REQUIRES_NEW内的REQUIRES_NEW内......等等

Har*_*n F 4 java java-ee ejb-3.0

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();
   }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

new transaction
-new transaction
--new transaction
--- new transaction
...(更多)
------- new transaciton(DB write)

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

jFr*_*tic 12

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

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

另见这里这里.后者是非常好的文章,解释了EJB中的事务管理.

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