1. ホーム
  2. java

[解決済み] Springトランザクションにおけるrequests_newとnested propagationの相違点

2023-04-21 06:37:42

疑問点

の動作の違いがよくわかりません。 PROPAGATION_REQUIRES_NEWPROPAGATION_NESTED プロパゲーションポリシーを使用しています。どちらの場合も、現在のプロセスはロールバックされますが、トランザクション全体はロールバックされないように思われます。何か手がかりはありますか?

どのように解決するのですか?

このリンクを参照してください。 PROPAGATION_NESTED vs PROPAGATION_REQUIRES_NEW? Juergen Hoellerが非常によく説明しています。-- Spring Source Forumは2019年2月28日から完全にオフラインになっていますが、以下の引用で記事の該当部分を読むことができます。

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

一方、PROPAGATION_NESTEDは、"nested"トランザクションを開始します。 これは既存のトランザクションの真のサブトランザクションです。何が起こるかというと ネストされたトランザクションの開始時にセーブポイントが取得されます。 トランザクションの開始時にセーブポイントが取られることです。ネストされたトランザクションが失敗した場合、そのセーブポイントにロールバックされます。 そのセーブポイントにロールバックします。ネストされたトランザクションはアウタートランザクションの一部です。 トランザクションの一部であり、従ってそれは外側トランザクションの終了時にのみコミットされます。 トランザクションの最後にのみコミットされます。...