Spring独立トランザクションとネストされたトランザクション

Springでのトランザクション伝搬のタイプ:

  • PROPAGATION_REQUIRED-現在のトランザクションをサポートします。現在トランザクションがない場合は、新しいトランザクションを作成します。(デフォルト)
  • PROPAGATION_SUPPORTS-現在のトランザクションをサポートします。現在トランザクションがない場合は、非トランザクション方式で実行されます。
  • PROPAGATION_MANDATORY-現在のトランザクションをサポートします。現在のトランザクションがない場合は、例外をスローします。
  • PROPAGATION_REQUIRES_NEW-新しいトランザクションを作成します。現在トランザクションがある場合は、現在のトランザクションを一時停止します。
  • PROPAGATION_NOT_SUPPORTED-操作は非トランザクション方式で実行されます。現在トランザクションがある場合、現在のトランザクションは一時停止されます。
  • PROPAGATION_NEVER-非トランザクション方式で実行します。現在トランザクションがある場合、例外がスローされます。
  • PROPAGATION_NESTED-トランザクションが現在存在する場合、ネストされたトランザクション内で実行されます。現在トランザクションがない場合は、PROPAGATION_REQUIREDと同様に進めます。

 

PROPAGATION_NESTEDと  PROPAGATION_REQUIRES_NEWの違い 

PROPAGATION_REQUIRES_NEWを使用すると、内部トランザクションと外部トランザクションは2つの独立したトランザクションのようになります。内部トランザクションがコミットされると、外部トランザクションはそれをロールバックできません。2つのトランザクションは互いに影響しません。2つのトランザクションは、真にネストされたトランザクションではありません。同時に、JTAトランザクションマネージャのサポートが必要です。環境に依存しない新しい「内部」トランザクションを開始します。このトランザクションは、外部トランザクションに依存せずに完全にコミットまたはロールバックされます。独自の分離スコープ、独自のロックなどがあります。内部トランザクションが実行を開始したとき外部トランザクションが中断されている場合、外部トランザクションは、内部トランザクションが終了したときに実行を続けます。

PROPAGATION_NESTEDを使用すると、外部トランザクションのロールバックにより、内部トランザクションがロールバックされる可能性があります。内部トランザクションの例外は、外部トランザクションのロールバックを引き起こさず、真にネストされたトランザクションです。DataSourceTransactionManagerがPROPAGATION_NESTEDをサポートするためにセーブポイントを使用する場合、JDBC 3.0以降のドライバーと1.4以降のJDKバージョンのサポートが必要です。他のJTA TrasactionManager実装では、サポート方法が異なる場合があります。PROPAGATION_NESTEDは、既存のトランザクションの実際のサブトランザクションである「ネストされた」トランザクションを開始します。潜在的なトランザクションの実行が開始されると、セーブポイントが取得されます。ネストされたトランザクションが失敗した場合、このセーブポイントにロールバックします。潜在トランザクションは外部トランザクションの一部であり、外部トランザクションの終了後にのみコミットされます。

 

概要:PROPAGATION_REQUIRES_NEWとPROPAGATION_NESTEDの最大の違いは、PROPAGATION_REQUIRES_NEWが完全に新しいトランザクションであるのに対し、PROPAGATION_NESTEDは外部トランザクションのサブトランザクションです。外部トランザクションがコミットすると、潜在トランザクションもコミットされます。このルールはロールバックにも適用されます。

おすすめ

転載: blog.csdn.net/qq_36807862/article/details/105995045