12

私の質問は基本的にここにあるものと同じですが、答えに満足できないので、この質問を書いています。

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?

それとも、これは別の接続 (Session オブジェクト) を使用して実装されている可能性がありますか? 元の接続の使用を停止し、新しいトランザクションを開始できる新しい接続を作成しますか?

私はここで何かを見逃しているので、誰もそれを説明しようとはしません (少なくとも、Spring ドキュメント、Spring in Action、Hibernate を使用した Spring 永続性では)。

どうもありがとう!

4

1 に答える 1

13

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

于 2013-10-24T02:14:00.200 に答える