奇妙な EJB トランザクション属性の問題が発生しました。@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) は、期待どおりに新しいトランザクションを開始しません。
EJB 3 を Weblogic で使用しています。
擬似コードは次のとおりです。
@Stateless
public class EJB1 implements IEJB1
{
@EJB
private IEJB2 ejb2;
@Override
public void method1()
{
for (i=0; i<N; i++) {
ejb2.method2();
}
}
}
@Stateless
public class EJB2 implements IEJB2
{
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void method2()
{
DBpersist();
}
}
EJB2.method2 に TransactionAttributeType.REQUIRES_NEW を指定したので、method2 に新しいトランザクションが作成されることを期待しています。しかし、テスト中に、method2 用に作成された新しいトランザクションがないことがわかりました。代わりに、method2 には EJB1.method1 と同じトランザクションがあります。Weblogic の API を使用して、トランザクション情報をログに記録しました。
次に、次のコード変更を行いました。
@Override
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED
public void method1()
{
for (i=0; i<N; i++) {
ejb2.method2();
}
}
このようにして、コンテナーは EJB2.method2 の新しいトランザクションを強制的に作成しました。
しかし、EJB1.method1 のデフォルトの TransactionAttributeType (TransactionAttributeType を指定しないことによる) と EJB2.method2 の TransactionAttributeType=REQUIRES_NEW を持っていたときに、コンテナーが EJB2.method2 の新しいトランザクションを作成しなかった理由がわかりません。
この質問に関連する既存の質問を検索しました。しかし、私が見つけたのは、同じ EJB 内の別のプライベート メソッドからプライベート メソッド (REQUIRES_NEW を使用) を呼び出す場合であり、EJB インターフェースを介して呼び出さない限り、コンテナーは新しいトランザクションを開始しません。これは私の場合ではありません。