0

以下に説明する状況の JDO では、 Afterが実行されますmethodB()(これは から呼び出されますmethodA()) 。注: PersistenceManager はオンデマンドで作成され、ThreadLocal に保存されます。methodA()methodA()methodB()methodA()methodB()

methodA() {
    PersistenceManager mgr = getPersistenceManager(  );
    Transaction trans;

    trans = mgr.currentTransaction(  );
    try {
        trans.begin(  );
        methodB();

        //some delete/update code
        // An exception occurs

        trans.commit(  );        
    }
    catch( Exception e ) {
        e.printStackTrace(  );
    }
    finally {
        if( trans.isActive(  ) ) {
            trans.rollback(  );
        }
        mgr.close(  );
    }
}

methodB() {
    PersistenceManager mgr = getPersistenceManager(  );
    Transaction trans;

    trans = mgr.currentTransaction(  );
    try {
        trans.begin(  );
        //code
        trans.commit(  );        
    }
    catch( Exception e ) {
        e.printStackTrace(  );
    }
    finally {
        if( trans.isActive(  ) ) {
            trans.rollback(  );
        }
        mgr.close(  );
    }
}
4

2 に答える 2

0

methodA と methodB はパート 2 の異なるトランザクションです。つまり、非アトミック トランザクションの理由: -

1> 2 つの異なるトランザクションに同じ PM インスタンスを使用しても、永続化されるネストされたメソッド B オブジェクトが常に「persistance-clean」状態にあるという保証がないため、2 つの異なるトランザクションが常に同じトランザクション インスタンス ID を使用しているとは限りません (サイドオブジェクトをダーティ状態に永続化する効果) と、メソッド B のトランザクションが以前のようにメソッド A に伝播されず、コミットされる前に再度 A に戻ります。

2>トランザクションはコンテキストに依存しないため、セッション全体またはメソッド シーケンスに対してトランザクションがコミットされることはありません。

3> spring template から参照されるように、特定のトランザクションについては、トランザクション インスタンスが常に取得され、トランザクション全体が完了すると、コミットされるだけです ([間接的に jdo ドキュメントでも間接的に言及されています : [1]: http:/ /www.datanucleus.org/products/accessplatform_4_1/jdo/transactions.html#spring )。考えられる 1 つの方法は、メソッド A がここでトランザクションのサブジェクトまたはオブザーバーとして機能し、メソッド B がサブスクライバーである必要があり、すべてのサブスクライバーが特定のトランザクションに対して通知されたときに、トランザクションをコミットする必要があることです。

詳細については、以下を参照してください:ネストされたオブジェクトに変更を反映するためのパターン

于 2018-03-01T22:31:21.373 に答える
0

トランザクションはネストされておらず、独立しています。PM が異なるため、txn も異なります。一方はロールバックに失敗し、もう一方は関係ありません

于 2013-05-10T17:10:03.467 に答える