หมวดหมู่: T-SQL

Microsoft SQL Server is Transact-SQL (T-SQL)

SQL Server: การ Lock objectSQL Server: การ Lock object

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


ลำดับขั้นของ Object

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

  • RID : Lock เฉพาะแถวเดียวใน Heap
  • Key: Lock เฉพาะแถวเดียวใน Index
  • Page: Lock ข้อมูลขนาด 8 KB
  • Extent: Lock กลุ่มของ Page
  • Table : Lock ทั้งตาราง
  • Database: Lock ทั้งฐานข้อมูล

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

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

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

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

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

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


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

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

  • WITH (NOLOCK) : เช่น SELECT * FROM Orders WITH (NOLOCK) เพื่อให้อ่านผ่านไปได้เลยโดยไม่ต้องรอ Lock
  • READ_COMMITTED_SNAPSHOT: ตั้งค่า Database ให้ใช้ระบบ “สำเนาข้อมูล” เพื่อให้การอ่านและการเขียนไม่ขวางทางกัน

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