ฉันกำลังตรวจสอบการบล็อกบางอย่างเมื่อฉันเห็นข้อความค้นหาที่มีลักษณะดังนี้:
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
SELECT SomeField FROM SomeTable NOLOCK (NOLOCK)สำหรับเอฟเฟกต์ nolock คู่))