(NOLOCK) กับ NOLOCK


24

ฉันกำลังตรวจสอบการบล็อกบางอย่างเมื่อฉันเห็นข้อความค้นหาที่มีลักษณะดังนี้:

SELECT SomeField FROM SomeTable NOLOCK

ฉันเห็นNOLOCKและอยากรู้ว่ามันจะบล็อกข้อความค้นหาอื่น ๆ ได้อย่างไรในกรณีDELETEนี้ ฉันลองดูที่ล็อคโดยใช้sp_lockและนี่คือสิ่งที่ฉันเห็น:

DB      S   GRANT

TAB     IS  GRANT

PAG    S    GRANT

ตอนนี้ความเข้าใจของฉันคือที่NOLOCKควรจะใช้ล็อค Schema-Stability เท่านั้นทำไมมันจึงคว้าล็อค IS?

ความอยากรู้ของฉันป่องๆ ฉันดู BOL และเห็นว่ามีสองวิธีในการใช้WITH (NOLOCK)และเลิกใช้แล้ว(NOLOCK)ดังนั้นฉันจึงตัดสินใจลองใช้ ฉันเรียกใช้แบบสอบถามต่อไปนี้ตามด้วยการเรียกใช้sp_lock:

SELECT SomeField FROM SomeTable WITH (NOLOCK)
DB S GRANT

TAB Sch-S GRANT
SELECT SomeField FROM SomeTable (NOLOCK)
DB S GRANT

TAB Sch-S GRANT

แน่นอนว่ามีล็อค Schema-Stability ของฉันอยู่ ดังนั้นคำถามของฉันคือสิ่งนี้เกิดอะไรขึ้นที่นี่ หากไวยากรณ์ที่ยอมรับสำหรับการใช้ NOLOCK เป็นอย่างใดอย่างหนึ่งWITH (NOLOCK)หรือ(NOLOCK)ทำไมข้อผิดพลาดแบบสอบถามไม่ออกเมื่อมันทำงานด้วยเพียงธรรมดาNOLOCK(โดยไม่ต้องวงเล็บ)? หากได้รับการสนับสนุนทำไมจึงต้องล็อค IS? สิ่งที่ฉันหายไปที่นี่? ฉันค้นหาคำตอบออนไลน์ แต่จนถึงขณะนี้ยังไม่เพียงพอ

ฉันได้ทดสอบสิ่งนี้ทั้งใน 2008R2 และ 2012


4
SELECT SomeField FROM SomeTable NOLOCK (NOLOCK)สำหรับเอฟเฟกต์ nolock คู่))
ypercubeᵀᴹ

คำตอบ:


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
ว้าวไม่แน่ใจว่าฉันไม่เข้าใจ มันทำให้ฉันบ้ามากตอนนี้ฉันแค่รู้สึกเขินอาย :) บางครั้งฉันก็คิดว่ามันง่ายที่สุด
Brian

2
@Brian ไม่ต้องกังวลฉันต้องแก้จุดบกพร่องบางอย่างที่คล้ายกันเมื่อเร็ว ๆ นี้มิฉะนั้นมันอาจจะไม่ง่ายที่จะสังเกตเห็น! คุณสามารถดูว่าทำไม MS จึงเลิกใช้ไวยากรณ์นั้น
Gareth Lyons

NOLOCK ไม่ใช่คำหลักที่สงวนไว้หรือไม่ ไม่ควรบ่นถ้าคุณไม่ใช้ [NOLOCK]
Aaroninus

6
ไม่msdn.microsoft.com/en-us/library/ms189822.aspxแม้ว่าจะปรากฏเป็นสีน้ำเงินใน SSMS ซึ่งจะทำให้คุณไม่สนใจ
Gareth Lyons

จับได้ดีฮ่า ๆ วันนี้ฉันชอบ Q / A
RBarryYoung
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.