Skip to main content

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 เราสามารถมั่นใจได้ว่าฐานข้อมูลจะยังคงอยู่ในสถานะที่เชื่อถือได้ตลอดเวลา