ในระบบ 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 | ชื่อเต็ม | ความหมายและสิ่งที่เกิดขึ้น |
| S | Shared | ใช้ตอนอ่านข้อมูล ( SELECT ): อนุญาตให้คนอื่นอ่านแถว / ตารางนี้พร้อมกันได้ แต่ห้ามใครมาแก้ไขจนกว่าจะอ่านจบ |
| X | Exclusive | ใช้ตอนเขียนข้อมูล ( UPDATE / DELETE / INSERT ): ห้ามคนอื่นเข้ามายุ่งเด็ดขาด ไม่ว่าจะอ่านหรือแก้ เพื่อป้องกันข้อมูลพัง |
| U | Update | โหมดกึ่งกลาง: ใช้ตอนกำลังค้นหาข้อมูลเพื่อจะ Update เพื่อป้องกันไม่ให้คนอื่นเข้ามาจองแก้ในเวลาเดียวกัน ( ป้องกัน Deadlock ) |
| IS | Intent Shared | บอกในระดับบน ( เช่น Table ) ว่า “ฉันกำลังถือ Lock แบบ S อยู่ที่ระดับล่าง ( เช่น Row ) นะ” |
| IX | Intent Exclusive | บอกในระดับบน ( เช่น Table ) ว่า “ฉันกำลังถือ Lock แบบ X อยู่ที่ระดับล่าง ( เช่น Row ) นะ” |
| SIX | Shared Intent Exclusive | “ฉันกำลังอ่านข้อมูลทั้งตาราง ( S ) และมีแผนจะแก้ไขบางแถว ( IX ) ในตารางนี้ด้วย” |
| Sch-M | Schema Modification | ใช้ตอนแก้โครงสร้าง: เช่น ALTER TABLE หรือ DROP TABLE ห้ามใครเข้าใกล้ตารางนี้เด็ดขาดแม้แต่จะอ่าน |
| Sch-S | Schema Stability | ใช้ตอน Compile Query: เพื่อล็อกโครงสร้างตารางไว้ไม่ให้ใครมาแก้ตอนที่ Query กำลังทำงาน ( เป็นโหมดที่เบาที่สุด ) |
อ่านเพิ่มเติม
