2011-08-23 20 views
5

私のアプリでは、データベースへの多くのコミットが複数の方法で順番に行われる複数のステップがあります。 例:SpringとHibernateを使用したネストされたトランザクション

A -> B -> C 
     -> D 
      ->E 
     -> F 
    -> G 

Aは、BがDのDはそうでEを呼び出し、呼び出し、そしてCを呼び出すBを呼び出します。これらのメソッドはすべていくつかのデータベース操作を持っています。 PROPAGATION_REQUIRED(宣言的トランザクション管理 - 春推奨の方法)からわかるように、Eが正常に完了した場合、トランザクション(およびEの操作がコミットされます)。さて、いくつかの例外のために、Fは、ロールバックにつながるはずです。私は持っていたいすべてロールバックから何をAしました。 これは宣言的トランザクション管理を介して可能ですか?または、プログラムによるトランザクション管理を使用する必要がありますか?

ありがとうございます。

答えて

7

最初に、相互に依存して複数の実行中のトランザクションが存在するという意味で、「ネスト」トランザクションはサポートされていません。

その後、propagation=REQUIREDは、その伝播を持つすべてのメソッドがすることを意味します。そのようなものが存在する場合

  • は、既存のトランザクションに参加して存在する。存在しない場合は

      は新しいトランザクションを開始

    これは(それがAによって開始された単一のトランザクションであるため、他の方法に伝播)あなたのシナリオでは、Fで障害が発生して、トランザクション全体をロールバックすることを意味し

  • +0

    私は完全にあなたに同意しているだろうメソッドが完了するとすぐにコミットが行われるようになるまで(私はどこかを見つけることができませんでした)私はここでの理解に間違っていると思う。実際のコミットはいつ行われますか(明示的に行う必要はありません。 –

    +1

    トランザクションを開始したメソッドが完了すると、コミットが発生します。この場合は「A」です。 – Bozho

    +0

    大丈夫です。すばらしいです。どうもありがとうございます。 –

    関連する問題