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