2013-10-22 15 views
6

私の質問は基本的にはhereと同じですが、私は答えに満足していないので、私はこの質問を書いています。 Springでのトランザクション停止はどのように機能しますか?

は春Frameworkのマニュアルでは、PROPAGATION_REQUIRES_NEWのために現在のトランザクションが中断されることが述べられています。これは実際どのように実装されていますか?ほとんどのデータベースはネストされたトランザクションをサポートしておらず、1つの接続で1つのトランザクションしか実行できないことがわかっています。つまり、元のトランザクションを「使用しない」だけでなく、新しいトランザクションを開始する前に、元のトランザクションをコミットまたはロールバックする必要があります。

例:

START TRANSACTION 
SELECT ... 
UPDATE ... 
-- Now we run method with PROPAGATION_REQUIRES_NEW 
-- How do we "suspend" transaction so we can start new one? 
START TRANSACTION 
UPDATE ... 
COMMIT 
-- We returned from the method, result was commited 
-- Now we'd like to "unsuspend" the original transaction so it can be commited/rollbacked, but how? 

またはこれはおそらく別の接続(セッションオブジェクト)を使用して実装されていますか?そこで、元の接続の使用をやめ、新しいトランザクションを開始できる新しいトランザクションを作成します。

私はここで誰もが(少なくともない春のドキュメント、アクション春、Hibernateで春の永続性で)それを説明するために気にしないように何かを明らかに不足しています。

ありがとうございます!

答えて

7

取引を停止する点は、新しいものにスレッドの現在のトランザクションを変更することです。新しいトランザクションと中断されたトランザクションが完全に独立しているため、これはネストされたトランザクションのセマンティクスと一致しません。トランザクションをサスペンドするための接続レベルのAPIはありません。そのため、これは別の接続を使用して行う必要があります。 SpringでJTAを使用している場合、これはJTAトランザクションマネージャによって行われます。 DataSourceTransactionManagerを使用している場合は、コードを調べて、現在の接続を「中断したリソース」として保存し、新しいトランザクションのデータソースから新しい接続を取得することがわかります。

+0

実際には、ネストされた例外がトランザクションを中断するのに適していないという印象を受けました。応答してくれてありがとう、それは今私にとってもっとはっきりしている。 – qbd

関連する問題