次のようなクエリを見つけたとき、いくつかのブロッキングを調査していました。
SELECT SomeField FROM SomeTable NOLOCK
私はこれを見てNOLOCK
、他のクエリ、この場合はDELETE
ステートメントをブロックする方法を知りました。私は使用しているロックを簡単に調べましたがsp_lock
、ここに私が見たものがあります:
DB S GRANT
TAB IS GRANT
PAG S GRANT
さて、私の理解では、これNOLOCK
はスキーマ安定性ロックのみを取得することになっていますが、なぜISロックを取得したのですか?
私の好奇心がそそられました。私はBOLを見て、それを使用する2つの方法がWITH (NOLOCK)
あり、廃止予定(NOLOCK)
であることがわかったので、それらを試してみることにしました。次のクエリを実行した後、実行しましたsp_lock
:
SELECT SomeField FROM SomeTable WITH (NOLOCK)
DB S GRANT TAB Sch-Sグラント
SELECT SomeField FROM SomeTable (NOLOCK)
DB S GRANT TAB Sch-Sグラント
案の定、スキーマ安定性ロックがあります。だから私の質問はこれです:ここで何が起こっているのですか?NOLOCKを使用するために受け入れられ構文のいずれかである場合WITH (NOLOCK)
や(NOLOCK)
、なぜクエリのエラーは、それが単なるを実行したときに出ませんNOLOCK
(括弧なし)?サポートされている場合、ISロックを取得するのはなぜですか?ここに何が欠けていますか?私はオンラインで答えを探していましたが、今のところ不足しています。
これを2008R2と2012の両方でテストしました。
SELECT SomeField FROM SomeTable NOLOCK (NOLOCK)
ダブルノーロック効果;)