web-dev-qa-db-ja.com

Springトランザクションでのrequires_newとネストされた伝播の違い

PROPAGATION_REQUIRES_NEWPROPAGATION_NESTED伝播ポリシーの動作の違いを理解できません。どちらの場合でも、現在のプロセスはロールバックされますが、トランザクション全体ではありません。どんな手掛かり?

68
Alexis Dufrenoy

このリンクを参照してください: PROPAGATION_NESTED vs PROPAGATION_REQUIRES_NEW? Juergen Hoellerが非常によく説明しています

PROPAGATION_REQUIRES_NEWは、指定されたスコープの新しい独立した「内部」トランザクションを開始します。このトランザクションは、外部トランザクションから完全に独立してコミットまたはロールバックされ、独自の分離スコープ、独自のロックセットなどを持ちます。外部トランザクションは、内部トランザクションの開始時に中断され、内部トランザクションが完了すると再開されます。完了しました。 ...

一方、PROPAGATION_NESTEDは、既存のトランザクションの真のサブトランザクションである「ネストされた」トランザクションを開始します。ネストされたトランザクションの開始時にセーブポイントが取得されます。ネストされたトランザクションが失敗した場合、そのセーブポイントにロールバックします。ネストされたトランザクションは外部トランザクションの一部であるため、外部トランザクションの終了時にのみコミットされます。 ...

95
Ralph

PROPAGATION_REQUIRES_NEW:影響を受けるトランザクションスコープごとに完全に独立したトランザクションを使用します。その場合、基礎となる物理トランザクションは異なるため、外部トランザクションは内部トランザクションのロールバックステータスの影響を受けずに、独立してコミットまたはロールバックできます。

PROPAGATION_NESTED:ロールバック可能な複数のセーブポイントを持つ単一の物理トランザクションを使用します。このような部分的なロールバックにより、内部トランザクションスコープはそのスコープのロールバックをトリガーできます。一部の操作がロールバックされても、外部トランザクションは物理トランザクションを続行できます。通常、この設定はJDBCセーブポイントにマップされるため、JDBCリソーストランザクションでのみ機能します。

check spring documentation

12