2011-07-13 6 views
2

実際には、PROPAGATION_NESTED(現在のトランザクションが存在する場合はネストされたトランザクション内で実行)とPROPAGATION_Required(現在のトランザクションをサポートする)の違いを探します。PROPAGATION_NESTEDとPROPAGATION_Requiredは春に必要ですか?

以下

は、単純なユースケースである

はメインクラスでは、我々は法1を呼び出し、JDBC [トランザクション1]を使用して、顧客を作成すると言います。まだコミットされていません。メインクラスのmethod2を呼び出し、ちょうど作成された顧客[Transaction2]のアカウントを作成します。今それを約束する。トランザクション2をネストされたトランザクションとして呼び出すことができます。我々はPROPAGATION_NESTED

としてトランザクション定義を定義する場合はネストされたとして私の理解あたりとして

は今、トランザクション2が扱われますが、我々はPROPAGATION_Requiredとしてそれを定義した場合には、現在のトランザクションをサポートします。ネストされたものと必要なものの違いは何ですか?

答えて

7

PROPAGATION_NESTEDは、DataSourceTransactionManagerとJDBC3ドライバでのみ使用できます。トランザクションの一部(つまり、Springの中でネストされたトランザクションを構成するもの)をロールバックできるように、セーブポイントを使用します。セーブポイントの仕組みについては、javadoc of Connectionを参照してください。

必須です。つまり、既に存在するトランザクションがある場合は、このトランザクションで作業を行います。それ以外の場合は、新しいトランザクションを開始し、作業を行い、トランザクションをコミットします。

+0

この例の場合、mainクラスではmethod1を呼び出し、jdbc [Transaction1]を使用して顧客を作成します。まだコミットされていません。メインクラスのmethod2を呼び出し、ちょうど作成された顧客[Transaction2]のアカウントを作成します。今それを約束する。あなたの説明どおり、これらのトランザクションは両方とも1つのトランザクションの一部として扱われます(接続で最大1つのトランザクションが存在する可能性があるため)。セーブポイントを部分的にロールバックまたはコミットすると、トランザクション2をネストされたトランザクションとして呼び出します。 –

+0

@Mohit Gupta:セーブポイントを使用して部分的にコミットすることはできません。 – Olaf

関連する問題