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


80

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


7
このリンクを参照してください:forum.springsource.org/archive/index.php/t-16594.html-Juergen Hoellerがそれを非常によく説明しています
Ralph

@ラルフ:ありがとう、まさにそれが私が探していたものです。答えとして追加する必要があります。
Alexis Dufrenoy 2012

1
@ラルフ:素晴らしい、それが最良の答えだろう。
Nandkumar Tekale 2012

1
したがって、主な違いは、ネストされたトランザクションポリシーを使用すると、トランザクションを現在のアトミック操作の最初にロールバックできることです。これは、requires_newポリシーの場合と同じですが、プロセス全体の最後にのみコミットされます。これは、requires_newポリシーとは完全に異なります。このポリシーでは、各アトミック操作が終了時にコミットされます。
Alexis Dufrenoy 2012

1
既存のページへの@Ralph残念ながら、あなたのリンクはもはやポイント:(
knittl

回答:


117

このリンクを参照してください:PROPAGATION_NESTEDとPROPAGATION_REQUIRES_NEW?JuergenHoellerはそれを非常によく説明しています。-春のソースフォーラムは、2019年2月28日SICE完全にオフラインになっているが、あなたは以下の引用で、物品の関連部分を読むことができます

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

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


良い答えと良い質問。あなたのご意見や次のリンクは私のために非常に有用であった:byteslounge.com/tutorials/...
yaki_nuka

あなたがpropagation_requires_newで説明したのは正しい振る舞いですか?確認したところ、両方のトランザクションがロールバックされました。
eatSleepCode 2015年

ネストされたトランザクションが失敗した場合(それも失敗しますか?)、またはその逆の場合の外部トランザクションの動作を明確にしてください
gstackoverflow 2017年

したがって、ネストされたトランザクションでは、内側のトランザクションがロールバックすると、外側のトランザクションは保存ポイントで続行されますが、外側のトランザクションがロールバックすると、すべてのアクションがロールバックされます。
Wecherowski 2017

行動に違いはありますか?
gstackoverflow

14

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

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

Springのドキュメントを確認してください


2
はい、下線の違いは理解していますが、動作が異なるかどうかはわかりません。ある場合は、を前のセーブポイントにロールバックし、別の場合は、外側のトランザクションではなく現在のトランザクションをロールバックしますが、実際、どちらの場合も、現在のアトミック操作の最初にロールバックし、その時点から再開します。
Alexis Dufrenoy 2012

1
@Traroth:@Ralphによるリンクの2行は、動作の違いを示しています。PROPAGATION_REQUIRES_NEW:外部トランザクションは、内部トランザクションの開始時に一時停止され、内部トランザクションが完了すると再開されます。各内部トランザクションは、完了時にコミット/ロールバックされます。PROPAGATION_NESTED:ネストされたトランザクションは外部トランザクションの一部であるため、外部トランザクションの最後にのみコミットされます。
Nandkumar Tekale 2012

私は同意するので、彼のコメントから答えを出すように彼に提案しました。
Alexis Dufrenoy 2012

1
@Traroth:私はあなたに同意します。:)彼は最良の答えを持っています。
Nandkumar Tekale 2012

-6

違いを見つけてください

1.) Use of NESTED Transaction

現在のトランザクションが存在する場合はネストされたトランザクション内で実行し、それ以外の場合はPROPAGATION_REQUIREDのように動作します。ネストされたトランザクションはSpringによってサポートされています

2.)必須トランザクションの使用現在のトランザクションをサポートし、存在しない場合は新しいトランザクションを作成します。。これは、引き出し、預金、トランザクションの更新などの銀行ドメインを意味します

3.)REQUIRES_NEWトランザクションの使用新しいトランザクションを作成し、現在のトランザクションが存在する場合は一時停止します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.