Transactions และ ACID Properties ใน PostgreSQL
บทนำ
ในฐานข้อมูล, Transaction หรือการทำธุรกรรมคือกลุ่มของการดำเนินการที่ต้องทำให้เสร็จสิ้นทั้งหมดหรือไม่ทำเลย (atomic). หากมีการดำเนินการใด ๆ ล้มเหลวระหว่างธุรกรรม การเปลี่ยนแปลงทั้งหมดจะต้องถูกยกเลิกเพื่อรักษาความถูกต้องของข้อมูล การทำงานนี้เรียกว่า ACID Properties
ACID คือคุณสมบัติหลักที่ทำให้ฐานข้อมูลสามารถรับประกันความถูกต้องและความสมบูรณ์ของข้อมูลในระหว่างการทำธุรกรรม ประกอบด้วย 4 หลักการหลัก ได้แก่:
- Atomicity (อะตอมิก)
- Consistency (ความสอดคล้อง)
- Isolation (การแยกกัน)
- Durability (ความทนทาน)
ในบทความนี้เราจะเรียนรู้เกี่ยวกับ Transactions และ ACID Properties ใน PostgreSQL
1. Transactions
Transaction คือการรวมคำสั่ง SQL หลายคำสั่งเข้าด้วยกันในลำดับที่ทำงานเป็นหน่วยเดียวเพื่อให้การดำเนินการทั้งหมดสำเร็จหรือทั้งหมดล้มเหลว หากคำสั่งใดคำสั่งหนึ่งในธุรกรรมล้มเหลว จะต้องมีการยกเลิกการเปลี่ยนแปลงทั้งหมด
การเริ่มต้น Transaction
ใน PostgreSQL, การเริ่มต้นธุรกรรมสามารถทำได้โดยใช้คำสั่ง BEGIN หรือ START TRANSACTION และสามารถสิ้นสุดได้โดยใช้คำสั่ง COMMIT หรือ ROLLBACK ตามสถานการณ์
- BEGIN / START TRANSACTION: ใช้เริ่มต้นธุรกรรมใหม่
- COMMIT: ใช้ในการบันทึกการเปลี่ยนแปลงทั้งหมดที่ทำในระหว่างธุรกรรม
- ROLLBACK: ใช้ในการยกเลิกการเปลี่ยนแปลงทั้งหมดในระหว่างธุรกรรม
ตัวอย่าง:
BEGIN;
INSERT INTO accounts (account_id, balance) VALUES (1, 1000);
UPDATE accounts SET balance = balance - 500 WHERE account_id = 1;
COMMIT;
ในตัวอย่างนี้, ธุรกรรมจะเริ่มต้นด้วยคำสั่ง BEGIN และเมื่อทุกอย่างเสร็จสมบูรณ์ คำสั่ง COMMIT จะบันทึกการเปลี่ยนแปลงทั้งหมด
หากเกิดข้อผิดพลาดระหว่างธุรกรรม, เราสามารถใช้ ROLLBACK เพื่อลบการเปลี่ยนแปลงทั้งหมดที่ทำไปแล้ว
BEGIN;
INSERT INTO accounts (account_id, balance) VALUES (1, 1000);
UPDATE accounts SET balance = balance - 500 WHERE account_id = 1;
-- หากมีข้อผิดพลาด, ใช้ ROLLBACK
ROLLBACK;
2. ACID Properties
การทำงานของ Transactions จะต้องเป็นไปตามหลักการของ ACID ซึ่งประกอบไปด้วย 4 คุณสมบัติหลัก ดังนี้:
2.1 Atomicity (อะตอมิก)
Atomicity หมายถึงการทำธุรกรรมให้เสร็จสิ้นทั้งหมดหรือไม่ทำเลย หากธุรกรรมมีการทำงานผิดพลาดระหว่างทาง การเปลี่ยนแปลงทั้งหมดจะถูกยกเลิก (Rollback) เพื่อให้ข้อมูลอยู่ในสถานะเดิมที่ไม่มีการเปลี่ยนแปลง
ตัวอย่าง: หากการโอนเงินจากบัญชีหนึ่งไปยังบัญชีอื่นมีคำสั่ง INSERT และ UPDATE หากคำสั่งใดคำสั่งหนึ่งล้มเหลว, ทั้งสองคำสั่งจะถูกยกเลิก
2.2 Consistency (ความสอดคล้อง)
Consistency หมายถึงการที่ฐานข้อมูลจะต้องอยู่ในสถานะที่ถูกต้องหลังจากการทำธุรกรรมเสร็จสิ้น นั่นคือ ธุรกรรมจะต้องทำให้ข้อมูลที่อยู่ในฐานข้อมูลเป็นไปตามข้อกำหนดและกฎที่ตั้งไว้ เช่น ข้อจำกัด, ข้อกำหนดของ Foreign Key หรือ Check Constraint
ตัวอย่าง: หากฐานข้อมูลมีข้อกำหนดว่าไม่สามารถฝากเงินในบัญชีที่มีเงินต่ำกว่า 0, เมื่อมีการทำธุรกรรม, ข้อกำหนดนี้จะต้องไม่ถูกละเมิด
2.3 Isolation (การแยกกัน)
Isolation หมายถึงการที่ธุรกรรมแต่ละรายการต้องทำงานอย่างอิสระจากธุรกรรมอื่น ๆ แม้ว่าหลายธุรกรรมจะทำงานพร้อมกันในเวลาเดียวกันก็ตาม การทำงานนี้จะช่วยให้ธุรกรรมหนึ่งไม่สามารถเห็นการเปลี่ยนแปลงที่ยังไม่ถูกยืนยันจากธุรกรรมอื่น ๆ
PostgreSQL รองรับ Isolation Levels หลายประเภทที่กำหนดวิธีการแยกการทำงานของธุรกรรม:
- Read Uncommitted: ธุรกรรมสามารถอ่านข้อมูลที่ยังไม่ถูก COMMIT จากธุรกรรมอื่น
- Read Committed: ธุรกรรมจะอ่านข้อมูลที่ถูก COMMIT แล้วเท่านั้น
- Repeatable Read: ธุรกรรมจะอ่านข้อมูลที่เหมือนเดิมตลอดระยะเวลาที่ทำงาน
- Serializable: ธุรกรรมจะถูกดำเนินการเหมือนกับการทำงานแบบเชิงลำดับ (serial)
2.4 Durability (ความทนทาน)
Durability หมายถึงเมื่อธุรกรรมทำการ COMMIT แล้ว ข้อมูลจะถูกบันทึกอย่างถาวรในฐานข้อมูลและไม่สามารถสูญหายไปได้ ถึงแม้จะมีการเกิดเหตุการณ์ผิดปกติ เช่น การปิดระบบหรือไฟดับ ข้อมูลที่ได้รับการ COMMIT จะต้องยังคงอยู่
ตัวอย่าง:
เมื่อทำการ COMMIT ธุรกรรมการโอนเงิน ข้อมูลเกี่ยวกับการโอนเงินจะต้องถูกบันทึกในฐานข้อมูลแม้ว่าระบบจะเกิดการรีสตาร์ทหรือดับไป
3. การจัดการกับข้อผิดพลาดใน Transactions
ใน PostgreSQL, หากเกิดข้อผิดพลาดระหว่างการทำธุรกรรม การใช้คำสั่ง ROLLBACK จะช่วยให้สามารถย้อนกลับการเปลี่ยนแปลงทั้งหมดที่ทำในระหว่างธุรกรรมได้
ตัวอย่าง:
BEGIN;
UPDATE accounts SET balance = balance - 500 WHERE account_id = 1;
-- หากเกิดข้อผิดพลาด, ใช้ ROLLBACK
ROLLBACK;
4. การใช้ SAVEPOINT
SAVEPOINT คือการสร้างจุดบันทึกระหว่างธุรกรรม ซึ่งสามารถย้อนกลับไปยังจุดนั้นได้โดยใช้คำสั่ง ROLLBACK TO SAVEPOINT โดยไม่ต้องยกเลิกธุรกรรมทั้งหมด
ตัวอย่าง:
BEGIN;
UPDATE accounts SET balance = balance - 500 WHERE account_id = 1;
SAVEPOINT savepoint1;
UPDATE accounts SET balance = balance + 200 WHERE account_id = 2;
-- หากเกิดข้อผิดพลาด, ย้อนกลับไปยัง savepoint1
ROLLBACK TO SAVEPOINT savepoint1;
COMMIT;
สรุป
Transactions และ ACID Properties เป็นหลักการพื้นฐานที่สำคัญสำหรับการจัดการข้อมูลในระบบฐานข้อมูล PostgreSQL ซึ่งช่วยให้สามารถรับประกันความถูกต้องและความสมบูรณ์ของข้อมูลแม้ว่าจะมีข้อผิดพลาดเกิดขึ้นระหว่างการดำเนินการธุรกรรม ด้วยการใช้งาน Atomicity, Consistency, Isolation, และ Durability เราสามารถมั่นใจได้ว่าฐานข้อมูลจะยังคงอยู่ในสถานะที่เชื่อถือได้ตลอดเวลา