次のようなクエリを見つけたとき、いくつかのブロッキングを調査していました。
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)ダブルノーロック効果;)