Concurrency Control & Locking (Row Lock, Table Lock, Deadlock Handling)

Sharing is caring!

การทำงานของฐานข้อมูลที่มีผู้ใช้งานพร้อมกันหลายคน (Concurrent Users) จำเป็นต้องมีกลไกในการควบคุมการเข้าถึงข้อมูลเพื่อป้องกันปัญหา เช่น ข้อมูลเสียหายหรือผลลัพธ์ไม่ถูกต้อง PostgreSQL มีฟีเจอร์ Concurrency Control และ Locking ที่ช่วยให้ระบบยังคงความถูกต้องแม้มีการทำงานพร้อมกัน

Concurrency Control คืออะไร?

Concurrency Control คือกลไกที่ช่วยจัดการการทำงานพร้อมกันหลาย ๆ Transaction เพื่อป้องกันปัญหา เช่น:

  • Dirty Read → อ่านค่าที่ยังไม่ Commit
  • Non-repeatable Read → อ่านค่าเดียวกันได้ผลลัพธ์ต่างกัน
  • Phantom Read → ได้แถวข้อมูลใหม่ที่ไม่เคยมีมาก่อนระหว่างการ Query

Locking ใน PostgreSQL

PostgreSQL ใช้ Lock หลายระดับในการควบคุมการเข้าถึงข้อมูล เช่น Row Lock และ Table Lock

Row Lock

ใช้ Lock เฉพาะ Row ที่ถูกแก้ไข → ทำให้ผู้ใช้หลายคนสามารถแก้ไข Row อื่นได้พร้อมกัน

BEGIN;
SELECT * FROM accounts WHERE id = 1 FOR UPDATE;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
COMMIT;
  

Table Lock

ใช้ Lock ทั้งตาราง → ป้องกันการแก้ไขโดยผู้อื่น แต่มีข้อเสียคือทำให้ Concurrency ลดลง

LOCK TABLE accounts IN EXCLUSIVE MODE;
  

Transaction Isolation Level

PostgreSQL รองรับ Isolation Level หลายแบบ เช่น:

  • READ COMMITTED → ค่า Default
  • REPEATABLE READ → ป้องกัน Non-repeatable Read
  • SERIALIZABLE → ป้องกันปัญหาทุกแบบ (ช้าที่สุด)
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
  

Deadlock คืออะไร?

Deadlock เกิดขึ้นเมื่อ Transaction 2 ตัว Lock กันและรอกันเอง ทำให้ไม่มีใครทำงานต่อได้

ตัวอย่าง Deadlock

-- Transaction A
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
-- รอ Transaction B

-- Transaction B
BEGIN;
UPDATE accounts SET balance = balance - 200 WHERE id = 2;
-- รอ Transaction A
  

การจัดการ Deadlock

  • ออกแบบ Transaction ให้สั้นที่สุด
  • Lock Resource ในลำดับเดียวกัน
  • ใช้ Timeout สำหรับ Lock
SET lock_timeout = '5s';
  

Best Practices

  • ใช้ Row Lock แทน Table Lock ถ้าเป็นไปได้
  • เลือก Isolation Level ให้เหมาะสมกับ Use Case
  • ตรวจสอบ Deadlock Logs เป็นประจำ
  • ออกแบบ Query ให้สั้น กระชับ

สรุป

การควบคุม Concurrency และ Locking เป็นสิ่งสำคัญในระบบฐานข้อมูลที่มีการใช้งานพร้อมกันจำนวนมาก การเลือกใช้ Row Lock, Table Lock และการจัดการ Deadlock อย่างเหมาะสม จะทำให้ระบบทำงานได้อย่างมีประสิทธิภาพและเสถียร

SEO Keywords

PostgreSQL Concurrency Control,Row Lock PostgreSQL,Table Lock PostgreSQL,Postgres Deadlock Handling,Transaction Isolation Level,Database Locking,การจัดการ Concurrency PostgreSQL

Leave a Reply

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *