3

EJB アプリケーションを実装しています。この時点で、トランザクションが必要です。3 つのメソッドを連続して実行する必要があり、1 つが失敗した場合はすべてロールバックする必要があります。ここ: http://www.conceptgo.com/gsejb/eb04.html、チュートリアルを見つけました。私のコード:

    try {
        javax.transaction.UserTransaction ut = (UserTransaction) ctx.lookup("java:comp/UserTransaction");
        ut.begin();
        Feeds feed = loadFeed(url);

        try{
            em.persist(feed);
            uf.setFeedId(feed.getFeedId());
            uf.setUserId(user_id);         
            em.persist(uf);
        }catch (EntityExistsException e){
            ut.rollback();
            return false;
        }catch (IllegalArgumentException ea){
            ut.rollback();
            return false;
        }
        if (feed.getFeedId()!= null && feed!=null) {
            ut.commit();
        }else{
            ut.rollback();
            return false;
        }

アプリを実行すると、次のエラー メッセージが表示されます。

Caused by: java.lang.IllegalStateException: BaseTransaction.checkTransactionState
 - ARJUNA016051: thread is already associated with a transaction

何が原因で、どうすれば解決できるかわかる方いらっしゃいますか?

4

3 に答える 3

5

このエラーは、トランザクションが既に進行中であることを意味します。これは、コンテナー管理トランザクションである可能性が高いです。

あなたのビーン/メソッドはどのように見えますか? JBoss7 のステートレス セッション Bean のデフォルトのトランザクション動作は、コンテナ管理トランザクションおよび「必須」トランザクション属性で実行されます。

したがって、コンテナー管理のトランザクションが機能すると仮定すると、UserTransaction は必要ありません。そのため、ルックアップと開始/コミット/ロールバックを削除できます。これは管理されるためです。

自分でトランザクションを管理したい場合は、Bean 管理のトランザクションを使用するように Bean をマークしてから、UserTransaction を開始/コミット/ロールバックできます。Bean 管理のトランザクションを使用するように Bean をマークするには、アノテーション @TransactionManagement(TransactionManagementType.BEAN) をクラスまたはメソッドに適用します。

于 2013-06-27T19:51:25.590 に答える
2

エラーが示すように、JBoss でコンテナー管理トランザクションを中断しようとしています。独自の方法でトランザクションを処理したい場合は、クラス/メソッド Bean 管理を変更してください。

@TransactionManagement(TransactionManagementType.BEAN) 
public void getTransaction(){
    //....
} 

これで JBoss エンドから安全になりましたが、Bean 管理のトランザクションでトランザクションの各ステップを定義する必要があることを確認してください。

于 2013-07-01T17:17:19.027 に答える