1

これは私の最初の投稿であり、Java関連のあらゆる種類の問題について時々訪れています。これはとても便利なサイトで、先輩たちがとても親切に他の人を助けてくれます。

環境:Oracle、Jboss、EJB 2、休止状態、MDB、MQ、CMP

アプリケーションで1日に1回または2回ランダムにデッドロックの問題が発生しているため、Hibernateトレースをオンにしました。高レベルのコードをお願いします

@Stateless
public class SaveData() {

@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
methodA(){

    Method B();
    em.persist(obj1);

    Method C();
    Method D();

    em.flush();
}

methodB(){

}

methodC(){

  em.persist(obj2);
}

methodD(){
  em.persist(obj3);
}

}//ビーンエンド

この問題は本番環境でのみ発生しており、他の場所では発生していないため、再現できませんでした。そこで、TransactionAttributeType.REQUIRES_NEWを追加して、同じトランザクションに保持します。次に、私の質問を示します。

  1. トランザクションの開始はMethodB()であり、終了はMethodD()ですか、それとも内部に新しいトランザクションがありますか?

  2. トランザクションIDまたはログメッセージでトランザクションの開始と終了をチェックして、すべてが1つのトランザクションで発生していることを確認するにはどうすればよいですか。

ご協力いただきありがとうございます。

4

1 に答える 1

0
  1. トランザクションの開始は MethodB() で終了は MethodD() ですか、それとも内部の新しいトランザクションはありますか? いいえ。トランザクションは A から開始され、内部で他のメソッドを呼び出すため、そこで終了します。また、トランザクション属性を明示的に指定していないため、デフォルトは になりますRequired。したがって、同じトランザクションが他の方法を介して伝播します。

  2. トランザクション ID またはログ メッセージでトランザクションの開始と終了をチェックして、すべてが 1 つのトランザクションで発生していることを確認するにはどうすればよいですか? CMT の場合、それを確認する方法がわかりませんが、明示的に監視および管理したい場合は、BMT を使用できます。その後、手動でトランザクションを開始および終了できます。

于 2012-05-11T08:13:38.503 に答える