(NOLOCK)vs NOLOCK


24

次のようなクエリを見つけたとき、いくつかのブロッキングを調査していました。

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の両方でテストしました。


4
SELECT SomeField FROM SomeTable NOLOCK (NOLOCK)ダブルノーロック効果;)
ypercubeᵀᴹ17年

回答:


52
SELECT SomeField
FROM   SomeTable NOLOCK 

は、エイリアスを作成したことを意味しますSomeTable AS NOLOCK。これを明確に確認するには、以下を試してください。

SELECT NOLOCK.SomeField
FROM   SomeTable NOLOCK 

これは明らかに、クエリのロック動作には影響しません。SSMSでキーワード&が青で表示されているにもかかわらず、NOLOCKはTransact-SQLの予約語ではないため、構文エラーは発生しないため、クエリは失敗しません。予約語のリスト:https : //msdn.microsoft.com/en-us/library/ms189822.aspx

ヒントとして使用するための正しい構文:

  • (NOLOCK) 有効ですが、非推奨です。
  • WITH (NOLOCK) 推奨される構文です。

14
うわー、どうして私がそれを理解しなかったかわからない。それは本当に私を夢中にさせていました、今私は恥ずかしく感じます:)それは時々最も簡単なことだと思います。
ブライアン

2
@ブライアン心配する必要はありません。最近非常によく似たものをデバッグする必要がありました。そうでなければ、見つけるのはそれほど簡単ではなかったかもしれません!MSがその構文を非推奨にしている理由がわかります。
ガレスライオンズ

NOLOCKは予約キーワードではありませんか?[NOLOCK]を使用しないと文句を言うべきではありませんか?
アアロニヌス

6
いいえ、msdn.microsoft.com / en-us / library / ms189822.aspx SSMSには青色で表示されますが、これはあなたを失望させる可能性があります。
ガレスライオンズ

いいキャッチ、LOL。今日の私のお気に入りのQ / A。
–RBarryYoung
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.