3
SQL Server 2008では、ネストされたトランザクションなどはありません。これらは存在するに過ぎません。また、一部の専門家は、利用可能な擬似ネストされたトランザクションを使用しないことを開発者に強いていることも知っています。たとえば、hereとなります。「ネストされたトランザクション」のXLOCKはいつリリースされますか?
しかし、特定のネストされたプロシージャの行でXLOCKを実行する必要がある場合がありますが、そのプロシージャの実行中だけです。それはロックでなければならず、私は明らかにロックをできるだけ落としたいと思っています。擬似コードで:
...outer procedure
BEGIN TRAN Inner
EXEC InnerProcedure
...InnerProcedure...
BEGIN TRAN Inner
SELECT ... WITH (XLOCK, ROWLOCK)
COMMIT TRAN Inner
-- NEVER rollback here; get the outer procedure to do this
...End InnerProcedure...
COMMIT TRAN Outer
私の質問は以下のとおりです。
- これは、SQL Serverがない、本当に巣取引を行うことを考えるとベスト・プラクティス・パターンですか?
- COMMIT TRAN Innerで、またはCOMMIT TRAN OuterでのみXLOCKをリリースしますか?答えは「はい」だと思います。
を - それは明らかな影響を綴ります。しかし、この問題はロールバックにしかないようで、処理方法はわかっています。長い間ロックを保持することは理想的ではないようです。 – IamIC
すべてのXロックは、最も外側のトランザクションがコミットするまで保持されます。そうしないと、内部トランザクションがコミットされた後に最外のトランザクションが常に*ロールバックできるため、読者はコミットされていない変更を読み取ることができます。 –
@リムス:良い点(いつものように) –