Skip to main content

Command Palette

Search for a command to run...

SQL Server Isolation Level - Lock ให้ตรงใจไม่ให้โดนด่า

Updated
1 min read

วันนี้เรามาดูปัญหาเกี่ยวกับ รอ จากการ Lock ของ SQL Server ว่าเราสามารถตรวจสอบว่าโปรแกรมที่ช้าเกิดจากประมวลผลช้า หรือ รออะไรอยู่ทำไมถึงนานแสนนานกว่าจะทำอะไรได้แต่ละที

จะรู้ได้อย่างไรว่าโดน Lock อยู่ ?

วิธีแรกแบบ GUI สามารถดูจาก Activity Monitor ว่ามี Process ของเรา Process อะไร Lock อยู่จาก Column Block By แล้วนำ spid ไปหาว่าเป็นของคำสั่งไหน

อีกวิธีจะเป็นการใช้ Query ในการดู โดยใช้คำสั่ง sp_lock เพื่อดูดว่า Process ของเรารอ (wait) Process ของใครอยู่ แล้วนำ Process ID นั้นมาดูว่าทำอะไรอยู่จากคำสั่ง

dbcc inputbuffer (เลข ProcessID)

แก้ปัญหาแบบไม่ต้องปรับ Code

เนื่องจากค่าเริ่มต้นของ SQL Server จะมีการ Lock ไม่ให้อ่านข้อมูลได้ ถ้ามีคนอื่นยังแก้ไข้อมูลไม่ เสร็จ เช่น BEGIN TRAN ไว้ แล้วยังไม่ COMMIT หรือแว๊ปไปทำอะไรที่ใช้เวลานานจนส่งผลให้คนอื่นต้องรอ รอ รอ โดยไม่รู้ว่ารออะไร ดังนั้น เราจะมาเริ่มต้นจากการทำความเข้าใจวิธีการ Lock ของ SQL Server กันก่อน ว่าจะ​โดน Lock กันตอนไหน อย่างไรบ้าง

SQL Server Isolation Level

  1. Read Committed (ค่าเริ่มต้น: ห้ามอ่านถ้ายังไม่ commit)

  2. Read Uncommitted (อ่านค่าใหม่ที่สุด ไม่ต้องรอการ commit)

  3. Repeatable Read (ถ้าอ่านอยู่ ห้ามใครแก้ไข/ลบข้อมูล แต่เพิ่มได้)

  4. Serializable (ถ้าอ่านอยู่ ห้ามใครเพิ่ม/แก้ไข/ลบข้อมูล)

  5. Snapshot (อ่านค่าที่ถูก commit ครั้งล่าสุด ไม่ต้องรอ commit)

โดยวิธีที่เป็นทีนิยมในการแก้ปัญหาการอ่านข้อมูลไม่ได้ถ้ามีคน Lock อยู่ จะใช้การตั้งค่า Isolaton Level เป็น Snapshot ที่มีข้อดีกว่าแบบ Read Uncommitted ที่เราจะไม่รู้เลยว่าค่าที่อ่านได้จะถูก Commit หรือไม่ ถ้าไม่ถูก Commit จะหมายถึงเรานำข้อมูลที่ไม่ถูกต้องหรือไม่มีอยู่จริงมาใช้ ในขณะที่แบบ Snapshot เป็นข้อมูลจริง ที่อาจจะถูกเปลี่ยนข้อมูลใหม่ถ้ามีการ Commit

แต่ Snapshot จะต้องมีการตั้งค่าในครั้งแรกก่อน โดยต้องไม่มี User เข้าใช้งานในการตั้งค่านี้ โดยใช้คำสั่งดังนี้ (รันครั้งเดียวใช้ได้ยาวๆ)

ALTER DATABASE db1 SET ALLOW_SNAPSHOT_ISOLATION ON
ALTER DATABASE db1 SET READ_COMMITTED_SNAPSHOT ON

เพียงเท่านี้ปัญหารอคอยเพราะโดนคนอื่น Lock อยู่ก็จะหมดไป :)

More from this blog

ทำไมทำ Index ไว้แล้วไม่ช่วยให้เร็วขึ้น

เคยสงสัยไหม ทำไม Table ที่มี Index เยอะมากๆ เสียพื้นที่เก็บ Index เพิ่มขึ้นเยอะแยะมากมายแล้ว แต่ก็ยังช้าอยู่ ตรวจสอบ Execution Plan แล้วก็ไม่เห็นเอา Index ที่สร้างไว้มาใช้งาน สาเหตุหลักเลยคือ SQL Server มองว่าเอามาใช้แล้วไม่ได้ช่วยให้เร็วขึ้น หรือมี ...

Sep 8, 20243 min read

แนะนำแนวทางการใช้ ssh-key แทนการใส่รหัสผ่านทุกครั้งที่เชื่อมต่อ ssh

ที่มา สำหรับคนที่จำเป็นต้องใช้ ssh สำหรับ remote ไปที่เครื่อง server แล้วไม่อยากที่จะต้องคอยใส่รหัสผ่านทุกครั้งไป สามารถใช้วิธีนี้ในการสร้างคีย์ แล้วเอา public key ไปไว้ที่เครื่อง Server ได้ง่ายๆ ดังนี้ 1. ที่เครื่องเรา (ssh client) ให้สร้าง key โดยใ...

May 8, 20242 min read
K

Kosol

6 posts