Site icon PlusMagi's Blog By Pitt Phunsanit

SQL Server: การ Lock object

ใน SQL Server การ Lock คือกลไกที่ Database Engine ใช้เพื่อจัดการการเข้าถึงข้อมูลของผู้ใช้หลายคนพร้อมกัน ( Concurrency Control ) เพื่อไม่ให้ข้อมูลเกิดความขัดแย้งกัน เช่น คนหนึ่งกำลังแก้ อีกคนกำลังอ่าน หรือแก้ไขพร้อมกันจนข้อมูลเพี้ยน


ลำดับขั้นของ Object ( Lock Hierarchy )

SQL Server ไม่ได้ Lock แค่ “ตาราง” เสมอไป แต่มันฉลาดพอที่จะเลือก Lock ในระดับที่เล็กลงเพื่อประหยัดทรัพยากร โดยไล่ลำดับดังนี้


โหมดการ Lock ที่ใช้บ่อย ( Lock Modes )

เพื่อให้เข้าใจง่าย ให้มองว่า Lock มี 3 โหมดหลักที่สู้กันอยู่

โหมดการ Lockชื่อเรียกคำอธิบาย
Shared (S)อ่านอย่างเดียวใช้ตอน SELECT ยอมให้คนอื่นอ่านได้พร้อมกัน แต่ห้ามใครแก้
Exclusive (X)เขียน/แก้ไขใช้ตอน INSERT/UPDATE/DELETE ห้ามคนอื่นอ่านและห้ามแก้เด็ดขาด
Intent (IS, IX)การจองล่วงหน้าใช้บอกในระดับบน (เช่น Page/Table) ว่าข้างในมี Row ที่โดน Lock อยู่ เพื่อป้องกันไม่ให้ใครมา Lock ทั้งตารางทับซ้อน

ปรากฏการณ์ “Lock Escalation”

บางครั้งถ้าคุณแก้ข้อมูลจำนวนมหาศาล ( เช่น Update 1 ล้านแถว ) SQL Server จะมองว่าการเก็บ Lock ระดับ Row 1 ล้านตัวนั้นเปลือง Memory มากเกินไป มันจะทำการ “ยกระดับการ Lock” ( Escalation ) จากระดับ Row ขึ้นไปเป็นระดับ Table Lock ทันที เพื่อประหยัดทรัพยากรระบบ

ข้อควรระวัง: เมื่อเกิด Escalation คนอื่นจะเข้าใช้งานตารางนั้นไม่ได้เลยจนกว่างานคุณจะเสร็จ


เทคนิคการเลี่ยงปัญหา Lock

ถ้าคุณจำเป็นต้องอ่านข้อมูลในตารางที่มีการ Update ตลอดเวลา และไม่ซีเรียสเรื่องความแม่นยำ 100% (ยอมรับ Dirty Read ได้) คุณสามารถใช้

อ่านเพิ่มเติม

Exit mobile version