Shared Lock ออกเมื่อ IsolationLevel.ReadUncommitted


10

ฉันอ่านว่าถ้าฉันใช้ IsolationLevel.ReadUncommitted แบบสอบถามไม่ควรออกล็อคใด ๆ อย่างไรก็ตามเมื่อฉันทดสอบสิ่งนี้ฉันเห็นล็อคต่อไปนี้:

Resource_Type: HOBT
Request_Mode: S (แชร์แล้ว)

ล็อค HOBT คืออะไร มีอะไรเกี่ยวข้องกับ HBT (ฮีปหรือล็อคแบบทรีไบนารี)

ทำไมฉันยังคงได้ล็อค S

ฉันจะหลีกเลี่ยงการล็อคที่ใช้ร่วมกันได้อย่างไรเมื่อทำการสอบถามโดยไม่เปิดตัวเลือกสแนปชอตระดับการแยก

ฉันกำลังทดสอบสิ่งนี้ใน SQLServer 2008 และตัวเลือกสแนปชอตตั้งเป็นปิด แบบสอบถามจะทำการเลือกเท่านั้น

ฉันเห็นว่าจำเป็นต้องใช้ Sch-S แม้ว่า SQL Server จะไม่แสดงในแบบสอบถามที่ล็อคอยู่ ทำไมมันถึงยังมีการล็อคที่ใช้ร่วมกันอยู่? ตาม:

ระดับการแยกธุรกรรม SET (Transact-SQL)

ธุรกรรมที่รันที่READ UNCOMMITTEDระดับจะไม่ออกการล็อกที่ใช้ร่วมกันเพื่อป้องกันไม่ให้ธุรกรรมอื่นแก้ไขข้อมูลที่อ่านโดยธุรกรรมปัจจุบัน

ดังนั้นฉันสับสนเล็กน้อย

คำตอบ:


13

ล็อค HOBT คืออะไร

ล็อคที่ป้องกันทรี B (ดัชนี) หรือหน้าข้อมูลฮีปในตารางที่ไม่มีดัชนีคลัสเตอร์

ทำไมฉันยังคงได้ล็อค S

สิ่งนี้เกิดขึ้นกับกอง ตัวอย่าง

SET NOCOUNT ON;

DECLARE @Query nvarchar(max) = 
   N'DECLARE @C INT; 
     SELECT @C = COUNT(*) FROM master.dbo.MSreplication_options';

/*Run once so compilation out of the way*/
EXEC(@Query);

DBCC TRACEON(-1,3604,1200) WITH NO_INFOMSGS;

PRINT 'READ UNCOMMITTED';
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
EXEC(@Query);

PRINT 'READ COMMITTED';
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
EXEC(@Query);

DBCC TRACEOFF(-1,3604,1200) WITH NO_INFOMSGS;

เอาท์พุต READ UNCOMMITTED

Process 56 acquiring Sch-S lock on OBJECT: 1:1163151189:0  (class bit0 ref1) result: OK

Process 56 acquiring S lock on HOBT: 1:72057594038910976 [BULK_OPERATION] (class bit0 ref1) result: OK

Process 56 releasing lock on OBJECT: 1:1163151189:0 

เอาท์พุต READ COMMITTED

Process 56 acquiring IS lock on OBJECT: 1:1163151189:0  (class bit0 ref1) result: OK

Process 56 acquiring IS lock on PAGE: 1:1:169 (class bit0 ref1) result: OK

Process 56 releasing lock on PAGE: 1:1:169

Process 56 releasing lock on OBJECT: 1:1163151189:0 

อ้างอิงจากบทความนี้อ้างอิงถึง Paul Randal เหตุผลในการBULK_OPERATIONล็อค HOBT ที่ใช้ร่วมกันนี้เพื่อป้องกันการอ่านหน้าเว็บที่ไม่ได้ฟอร์แมต


5

ระดับการแยกแบบอ่านไม่ระบุได้รับการล็อค ล็อคความมั่นคงของสคีมาป้องกันไม่ให้วัตถุที่ถูกสอบถามเปลี่ยนแปลงในขณะที่ดำเนินการค้นหา การล็อคนี้ได้มาภายใต้ระดับการแยกทั้งหมดรวมถึงสแน็ปช็อตและ read_committed_snapshot (RCSI) จากโหมดล็อค :

ล็อคสคีมา

กลไกจัดการฐานข้อมูลใช้การล็อค schema (Mod-Modification) ในระหว่างการดำเนินการตารางข้อมูลคำจำกัดความภาษา (DDL) เช่นการเพิ่มคอลัมน์หรือวางตาราง ในช่วงเวลาที่มีการล็อค Sch-M ป้องกันการเข้าถึงตารางพร้อมกัน ซึ่งหมายความว่าล็อค Sch-M จะบล็อกการทำงานภายนอกทั้งหมดจนกระทั่งล็อคถูกปลด

การดำเนินงาน data manipulation language (DML) บางอย่างเช่นการตัดทอนตารางใช้การล็อค Sch-M เพื่อป้องกันการเข้าถึงตารางที่ได้รับผลกระทบจากการทำงานพร้อมกัน

โปรแกรมฐานข้อมูลใช้การล็อก schema เสถียรภาพ (Sch-S) เมื่อรวบรวมและดำเนินการแบบสอบถาม ล็อค Sch-S ไม่ได้ล็อคการทำธุรกรรมใด ๆ รวมถึงล็อคเอกสิทธิ์ (X) ดังนั้นธุรกรรมอื่น ๆ รวมถึงรายการที่มีการล็อก X บนตารางจะยังคงทำงานต่อไปในขณะที่กำลังรวบรวมแบบสอบถาม อย่างไรก็ตามการดำเนินการ DDL พร้อมกันและการดำเนินการ DML พร้อมกันที่ได้รับการล็อค Sch-M ไม่สามารถดำเนินการบนตาราง

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