2016-12-20 19 views
1
UPDATE PS --WITH(ROWLOCK) optionA 
SET NewColumn = 
(CASE 
    WHEN (PS.ColumnA IS NOT NULL AND PS.ColumnA > 0) THEN PS.ColumnA 
    ELSE TableB.SomeColumn END 
) 
FROM MainTable AS PS WITH(ROWLOCK) -- optionB 
INNER JOIN TableA WITH(NOLOCK) ON TableA.ID = PS.TableAID 
INNER JOIN TableB WITH(NOLOCK) ON TableB.ID = TableA.TableBID 

上記のステートメントは、がROWLOCKであることを確認する正しい方法ですが、インナーは他のテーブルをNOLOCKと結合していますか?Inner join nolock中にRowlockを使用して更新を適用する方法?

optionAoptionBの両方がうまく実行されていると思われます。そのため、両方とも正しいかどうかわかりませんrowlock

MainTableには更新スクリプトを実行している間に1億のレコードがあるので、MainTableがローロックであることを確認する方法はありますか?

+0

更新ステートメントが実行前に期待通りにロックされることを確認したいとお考えですか? –

答えて

0

WITH(ROWLOCK)の後にUPDATE PS(オプションA)の後に書かれたほとんどのコードは、更新ステートメントに必ずfrom句が含まれているとは限りませんが、どちらのオプションも機能的に同じです。

更新文が実行されている間にWITH (ROWLOCK)が期待どおりに動作しているかどうかを確認するためには、必要はないと言います。ロックヒントが指定されています。これは、ロックの細分性を選択する通常の処理よりも優先されます。

+1

'FROM'パーツで' UPDATE PS' ORの後に 'WITH(ROWLOCK)'を置くことによってエラーをスローすることはなく、両方が実行可能です。どちらも正しく、本当に期待通りにロックされていますか? –

+0

ちょうど良い方法で、それは数年のうちに片方しか書いていないことが影響しているのを見て、私は答えを編集しました。 –

関連する問題