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()
写入数据库。
这是一个人为的例子,但在我们的代码库中看到了类似的代码。代码实际上工作正常。
然而,这感觉很糟糕,我担心每个方法上的@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
甚至不会实际执行任何数据库写入。这是否实际上每次为每个方法调用创建一个新事务,结果为:
新交易
- 新交易
- 新交易
---新交易
......(更多)
-------新的transaciton(DB写)
然后在那时解开?这会不会引起性能问题?额外的想法?