SQL Server: Lock Mode

Byphunsanit

SQL Server: Lock Mode

ในระบบ SQL Server Lock Mode คือตัวบอก “สิทธิ์” ( Permission ) ในการเข้าถึงทรัพยากรนั้น ๆ ว่าคนที่ถือ Lock อยู่กำลังทำอะไร และยอมให้คนอื่นเข้ามาทำอะไรได้บ้าง


โหมดพื้นฐาน ( Basic Modes )

  • S ( Shared ): * ความหมาย: ใช้สำหรับการ “อ่าน” ( SELECT )
    • พฤติกรรม: ยอมให้คนอื่นเข้ามาอ่าน ( S ) พร้อมกันได้หลายคน แต่ ห้าม ใครเข้ามาแก้ไข ( X ) จนกว่าจะอ่านเสร็จ
  • X ( Exclusive )
    • ความหมาย: ใช้สำหรับการ “เขียน/แก้ไข” ( INSERT, UPDATE, DELETE )
    • พฤติกรรม: เป็นโหมดเผด็จการ ห้ามคนอื่นเข้ามายุ่งเด็ดขาด ไม่ว่าจะอ่านหรือเขียน เพื่อป้องกันข้อมูลเพี้ยน
  • U ( Update )
    • ความหมาย: โหมดเตรียมตัวแก้ไข
    • พฤติกรรม: ใช้ตอนที่ SQL กำลังค้นหาแถวเพื่อจะ Update ( ป้องกันไม่ให้เกิด Deadlock ในจังหวะที่ S จะเปลี่ยนเป็น X ) โดย U จะยอมให้คนอื่นอ่านได้ แต่ห้ามคนอื่นมาจอง U หรือ X ซ้อน

โหมดแสดงเจตจำนง ( Intent Modes )

โหมดเหล่านี้มักจะขึ้นที่ระดับ OBJECT ( Table ) เพื่อบอกว่า “ข้างในตารางนี้ มีบางแถวโดน Lock อยู่นะ”

  • IS ( Intent Shared ): บอกว่า “ข้างในตารางนี้ มีบางแถวที่ฉันกำลังอ่านอยู่ ( S )”
  • IX ( Intent Exclusive ): บอกว่า “ข้างในตารางนี้ มีบางแถวที่ฉันกำลังแก้ไขอยู่ ( X )”
  • SIX ( Shared with Intent Exclusive ): บอกว่า “ฉันกำลังอ่านทั้งตารางนี้อยู่ และกำลังจะแก้ไขบางแถวในนี้ด้วย”

สรุปตารางความเข้ากันได้ ( Lock Compatibility )

ถ้า Mode ชนกันจะเกิดสถานะ WAIT

Mode ที่ถืออยู่ขอ S (อ่าน)ขอ X (เขียน)ผลลัพธ์
S (อ่านอยู่)✅ ได้❌ ติด WAITอ่านพร้อมกันได้ แต่แก้ไม่ได้
X (เขียนอยู่)❌ ติด WAIT❌ ติด WAITคนอื่นทำอะไรไม่ได้เลย ต้องรอ
IX (จองแก้บางแถว)❌ ติด WAIT*✅ ได้**ถ้าแก้คนละแถวทำได้ แต่ถ้าจะอ่านทั้งตารางต้องรอ

ความหมายของ Lock Mode ในผลลัพธ์ SQL

LockModeชื่อเต็มความหมายและสิ่งที่เกิดขึ้น
SSharedใช้ตอนอ่านข้อมูล ( SELECT ): อนุญาตให้คนอื่นอ่านแถว / ตารางนี้พร้อมกันได้ แต่ห้ามใครมาแก้ไขจนกว่าจะอ่านจบ
XExclusiveใช้ตอนเขียนข้อมูล ( UPDATE / DELETE / INSERT ): ห้ามคนอื่นเข้ามายุ่งเด็ดขาด ไม่ว่าจะอ่านหรือแก้ เพื่อป้องกันข้อมูลพัง
UUpdateโหมดกึ่งกลาง: ใช้ตอนกำลังค้นหาข้อมูลเพื่อจะ Update เพื่อป้องกันไม่ให้คนอื่นเข้ามาจองแก้ในเวลาเดียวกัน ( ป้องกัน Deadlock )
ISIntent Sharedบอกในระดับบน ( เช่น Table ) ว่า “ฉันกำลังถือ Lock แบบ S อยู่ที่ระดับล่าง ( เช่น Row ) นะ”
IXIntent Exclusiveบอกในระดับบน ( เช่น Table ) ว่า “ฉันกำลังถือ Lock แบบ X อยู่ที่ระดับล่าง ( เช่น Row ) นะ”
SIXShared Intent Exclusive“ฉันกำลังอ่านข้อมูลทั้งตาราง ( S ) และมีแผนจะแก้ไขบางแถว ( IX ) ในตารางนี้ด้วย”
Sch-MSchema Modificationใช้ตอนแก้โครงสร้าง: เช่น ALTER TABLE หรือ DROP TABLE ห้ามใครเข้าใกล้ตารางนี้เด็ดขาดแม้แต่จะอ่าน
Sch-SSchema Stabilityใช้ตอน Compile Query: เพื่อล็อกโครงสร้างตารางไว้ไม่ให้ใครมาแก้ตอนที่ Query กำลังทำงาน ( เป็นโหมดที่เบาที่สุด )

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

About the author

phunsanit administrator