2011-07-14 11 views
3

まず、ネストされたトランザクションの意味を説明しましょう。JDBCでネストされたトランザクションを実装するにはどうすればよいですか?

例:メインクラスではmethod1と呼び出し、jdbc [Transaction1]を使用して得意先を登録します。まだコミットされていません。ここでメインクラスのmethod2と呼び出し、作成したばかりの顧客[Transaction2]のアカウントを作成します。今それを約束する。あなたの説明どおり、これらのトランザクションは両方とも1つのトランザクションの一部として扱われます(1つの接続で最大1つのトランザクションが存在する可能性があるため)。ここまでで、上記のシナリオを比較すると、propagation_requiredSpringになります。あれは正しいですか?

ここで、トランザクション2だけをコミットしたい場合。このシナリオは、春のpropagation_Nestedのようになります。あれは正しいですか?

上記の両方の仮定が正しい場合、どのようにJDBCにネストされたトランザクションを実装できますか?

+0

あなたの質問がなぜ落とされたのか分かりません。これは正当な質問のようです。私はバランスを保つためにそれを捨てました。 – Olaf

答えて

3

これは、ネストされたトランザクションの動作を正確に示していません。トランザクション1をロールバックすると、トランザクション2もロールバックされます。ネストされたトランザクションでは、トランザクション2をロールバックしてトランザクション1をコミットできます。

JDBCでは、セーブポイントを使用してこの効果を達成できます。アカウントを作成する前にConnection.setSavepoint()を呼び出して、そのアクションをロールバックするが依然として顧客の作成をコミットする場合は、そのセーブポイントにロールバックすることができます。

2つのトランザクションをSpring REQUIRES_NEWのように完全に独立してコミット/ロールバックできるようにするには、JDBCで2つの接続を使用し、トランザクションを個別に管理する必要があります。

+0

上記の両方のトランザクションを(connevtion.commitを使用して)一度にコミットしているとします。処理中に、トランザクション2中に何らかの例外が発生します。今や結果は何か、部分コミットか両方のトランザクションがロールバックされますか? –

+0

この場合、トランザクション2をロールバックしてトランザクション1をコミットできるはずだから、ユーザーは作成されますが、そのユーザーのアカウントは作成されないようにする必要があります。 – Olaf

関連する問題