ACID
คุณสมบัติพื้นฐาน 4 ข้อที่ relational database ต้องมีเพื่อให้ transaction ทำงานถูกต้อง: Atomicity, Consistency, Isolation, Durability
Transaction คืออะไร?
Transaction = กลุ่มของ queries ที่ทำงานเป็น หน่วยเดียว (one unit of work)
BEGIN TX1;
SELECT BALANCE FROM ACCOUNT WHERE ID = 1; -- เช็คยอด
UPDATE ACCOUNT SET BALANCE = BALANCE - 100 WHERE ID = 1; -- หักเงิน A
UPDATE ACCOUNT SET BALANCE = BALANCE + 100 WHERE ID = 2; -- เพิ่มเงิน B
COMMIT TX1;Lifecycle: BEGIN → ทำงาน → COMMIT (ยืนยัน) หรือ ROLLBACK (ยกเลิก) — ถ้า crash ก่อน commit → rollback อัตโนมัติ
Transaction ไม่จำเป็นต้องมี write — read-only transaction ใช้เพื่อให้ snapshot คงที่ตลอดการอ่าน (เช่น ทำรายงาน)
1. Atomicity (อะตอม-แบ่งไม่ได้)
ถ้า query ใดใน transaction fail → query ที่สำเร็จไปแล้วทั้งหมดต้อง rollback กลับไปสภาพก่อนเริ่ม
ตัวอย่าง: โอนเงิน 100 บาท — ถ้า DB crash หลัง UPDATE บัญชี A แต่ก่อน UPDATE บัญชี B → เงิน $100 หายไป! Atomicity ป้องกันเรื่องนี้
Pitfall: deadlock, network timeout, app crash, OOM ระหว่าง transaction เกิดบ่อยกว่าที่คิด → ห่อ critical operations ใน explicit transaction เสมอ
2. Consistency (ความสอดคล้อง)
มี 2 ความหมายที่คนสับสนบ่อย:
Consistency in Data (ของ ACID)
กำหนดโดย user/schema — referential integrity (FK), constraints, atomicity, isolation ที่ทำให้ data ไม่ขัดกัน
Consistency in Reads (ของ distributed systems)
เขียนที่ master แล้ว replica เห็นทันทีมั้ย? → นี่คือ eventual consistency ใน CAP Theorem
“Consistency ใน ACID” ≠ “Consistency ใน CAP theorem” — คนละเรื่องกัน!
3. Isolation (การแยกระดับการมองเห็น)
คำถามหลัก: transaction ที่กำลังทำงานอยู่ เห็น changes ของ transaction อื่น ที่ทำพร้อมกันมั้ย?
→ รายละเอียดอยู่ใน Transaction Isolation
4. Durability (ความคงทน)
หลัง commit สำเร็จ → ข้อมูลต้อง อยู่จริง ในที่เก็บถาวร แม้ DB จะ crash ทันที
เทคนิคที่ใช้:
- WAL (Write-Ahead Log) — เขียน log ก่อนเขียน data จริง → crash → recovery จาก log
- Asynchronous Snapshot — เก็บ data ใน memory ก่อน periodic flush (เร็วแต่เสี่ยง)
- AOF (Append-Only File) — Redis ใช้ append ทุก write command ไปที่ file
OS Cache คือศัตรู
DB เขียนข้อมูล → OS อาจ cache ไว้ใน memory ก่อน flush ลง disk จริง → ไฟดับก่อน flush → หาย → DB จริงจังต้องสั่ง fsync() บังคับเขียนลง disk
Pitfall: SSD บางรุ่น “lie” เกี่ยวกับ fsync → enterprise SSD จึงมี battery-backed cache
Key Points
- ACID = มาตรฐาน transaction ของ relational DB
- Atomicity = all-or-nothing — fail ต้อง rollback ทั้งหมด
- Consistency ใน ACID ≠ ใน CAP — อย่าสับสน
- Isolation = transactions ไม่กวนกัน → ดู Transaction Isolation
- Durability = commit แล้วไม่หาย → WAL + fsync
- Read-only transaction ก็มี — ใช้เพื่อ snapshot consistency
Related
- Transaction Isolation — 4 read phenomena + 4 isolation levels
- WAL — เทคนิคหลักสำหรับ durability
- Concurrency Control — locks ที่ enforce isolation
- CAP Theorem — Consistency คนละความหมายกับ ACID
- PostgreSQL — ใช้ MVCC สำหรับ isolation
- MySQL — InnoDB รองรับ ACID ครบ