2010-12-12 9 views
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 

私の質問は以下のとおりです。

  1. これは、SQL Serverがない、本当に巣取引を行うことを考えるとベスト・プラクティス・パターンですか?
  2. COMMIT TRAN Innerで、またはCOMMIT TRAN OuterでのみXLOCKをリリースしますか?答えは「はい」だと思います。

答えて

4
  1. 号は、(でもTSQLで) 'ネストされた' トランザクションを使用しないでください。最高でも、彼らは思ったとおりに動作しません:A SQL Server DBA myth a day: (26/30) nested transactions are real (False)

  2. XLOCKは外部トランザクションスコープで解放されます。 [更新:レムスのアドバイス含める]私は、参照記事の

+0

を - それは明らかな影響を綴ります。しかし、この問題はロールバックにしかないようで、処理方法はわかっています。長い間ロックを保持することは理想的ではないようです。 – IamIC

+1

すべてのXロックは、最も外側のトランザクションがコミットするまで保持されます。そうしないと、内部トランザクションがコミットされた後に最外のトランザクションが常に*ロールバックできるため、読者はコミットされていない変更を読み取ることができます。 –

+0

@リムス:良い点(いつものように) –

関連する問題