メインコンテンツへ移動

เนื้อหาภาษาไทย / タイ語のコンテンツ

システムガイド 内容確認済み

Transaction คืออะไร?

บทความนี้อธิบายว่า Transaction คือหน่วยการทำงานที่ไม่สามารถแบ่งแยกได้ในฐานข้อมูล ซึ่งรับประกันว่าการดำเนินการทั้งหมดจะสำเร็จหรือไม่สำเร็จเลย เพื่อรักษาความสมบูร...

Transaction คืออะไร? ทำไมต้องใช้?

ในโลกของการจัดการฐานข้อมูล, Transaction คือลำดับของปฏิบัติการ (Operations) ที่ถูกมองว่าเป็นหน่วยงานเดียวที่สมบูรณ์ (Atomic unit of work) นั่นหมายความว่า ปฏิบัติการทั้งหมดใน Transaction จะต้องสำเร็จทั้งหมด หรือไม่สำเร็จเลย (All or Nothing) หากมีส่วนใดส่วนหนึ่งล้มเหลว Transaction จะถูกยกเลิก (Rollback) และฐานข้อมูลจะกลับสู่สถานะเดิมก่อนเริ่ม Transaction

ลองนึกภาพการโอนเงินจากบัญชีหนึ่งไปยังอีกบัญชีหนึ่ง คุณต้อง:

  1. ลดจำนวนเงินในบัญชีผู้โอน
  2. เพิ่มจำนวนเงินในบัญชีผู้รับโอน

ถ้าเกิดเหตุการณ์ไม่คาดฝัน เช่น ไฟดับ หรือระบบขัดข้อง หลังจากที่คุณลดจำนวนเงินในบัญชีผู้โอนไปแล้ว แต่ยังไม่ได้เพิ่มจำนวนเงินในบัญชีผู้รับโอน จะเกิดอะไรขึ้น? เงินจะหายไปจากระบบ! นี่คือเหตุผลที่เราต้องการ Transaction

Transaction ช่วยให้มั่นใจได้ว่าการโอนเงินจะสำเร็จทั้งหมด หรือไม่สำเร็จเลย ถ้ามีข้อผิดพลาดเกิดขึ้นระหว่างทาง Transaction จะถูก Rollback และเงินจะยังคงอยู่ในบัญชีผู้โอน

ACID Properties: หัวใจสำคัญของ Transaction

Transaction ถูกควบคุมโดยคุณสมบัติ ACID ซึ่งเป็นตัวย่อที่แสดงถึงคุณสมบัติสำคัญ 4 ประการ:

  • Atomicity (ความเป็นหน่วยเดียว): ปฏิบัติการทั้งหมดใน Transaction จะถูกดำเนินการทั้งหมด หรือไม่ถูกดำเนินการเลย
  • Consistency (ความสอดคล้อง): Transaction จะต้องเปลี่ยนสถานะของฐานข้อมูลจากสถานะที่ถูกต้องไปยังอีกสถานะที่ถูกต้องเสมอ
  • Isolation (ความเป็นอิสระ): Transaction ที่กำลังดำเนินการอยู่จะต้องไม่ถูกรบกวนจาก Transaction อื่นๆ ที่กำลังดำเนินการพร้อมกัน
  • Durability (ความคงทน): เมื่อ Transaction สำเร็จ (Committed) การเปลี่ยนแปลงที่เกิดขึ้นจะต้องคงอยู่ถาวร แม้ว่าระบบจะล้มเหลว

เรามาเจาะลึกแต่ละคุณสมบัติกัน:

Atomicity

Atomicity รับประกันว่า Transaction จะเป็นหน่วยงานที่ไม่สามารถแบ่งแยกได้ หากมีปฏิบัติการใดๆ ใน Transaction ล้มเหลว Transaction ทั้งหมดจะถูก Rollback กลับสู่สถานะเดิม ตัวอย่างเช่น ในการโอนเงิน หากการลดจำนวนเงินในบัญชีผู้โอนสำเร็จ แต่การเพิ่มจำนวนเงินในบัญชีผู้รับโอนล้มเหลว Transaction จะถูก Rollback และเงินจะยังคงอยู่ในบัญชีผู้โอน

Consistency

Consistency รับประกันว่า Transaction จะนำฐานข้อมูลจากสถานะที่ถูกต้อง (Consistent state) ไปสู่สถานะที่ถูกต้องอีกสถานะหนึ่ง Transaction จะต้องไม่ละเมิดข้อจำกัด (Constraints) หรือกฎเกณฑ์ใดๆ ที่กำหนดไว้ในฐานข้อมูล ตัวอย่างเช่น หากคุณมีข้อจำกัดว่ายอดเงินในบัญชีจะต้องไม่น้อยกว่า 0 Transaction ที่พยายามลดจำนวนเงินในบัญชีให้ต่ำกว่า 0 จะถูกยกเลิก

Isolation

Isolation ควบคุมระดับการมองเห็นของ Transaction ที่กำลังดำเนินการอยู่ต่อ Transaction อื่นๆ ที่กำลังดำเนินการพร้อมกัน Transaction ที่มีระดับ Isolation สูงจะมองเห็นเฉพาะข้อมูลที่ Committed แล้วเท่านั้น ในขณะที่ Transaction ที่มีระดับ Isolation ต่ำอาจมองเห็นข้อมูลที่ยังไม่ Committed ซึ่งอาจนำไปสู่ปัญหาต่างๆ เช่น Dirty Reads, Non-repeatable Reads และ Phantom Reads การเลือกระดับ Isolation ที่เหมาะสมเป็นเรื่องของการแลกเปลี่ยน (Trade-off) ระหว่างความถูกต้องและความพร้อมใช้งาน (Concurrency)

Trade-off: การเพิ่มระดับ Isolation จะทำให้ Transaction มีความเป็นอิสระมากขึ้น แต่ก็อาจทำให้ประสิทธิภาพลดลงเนื่องจากการ Lock ข้อมูลมากขึ้น ในทางกลับกัน การลดระดับ Isolation จะทำให้ Transaction ทำงานได้เร็วขึ้น แต่ก็อาจเสี่ยงต่อปัญหาความไม่สอดคล้องกันของข้อมูล

แนวปฏิบัติที่ดี: เลือกระดับ Isolation ที่เหมาะสมกับความต้องการของแอปพลิเคชันของคุณ โดยพิจารณาจากความสำคัญของข้อมูลและความพร้อมใช้งาน

Durability

Durability รับประกันว่าเมื่อ Transaction สำเร็จ (Committed) การเปลี่ยนแปลงที่เกิดขึ้นจะต้องคงอยู่ถาวร แม้ว่าระบบจะล้มเหลว ข้อมูลที่ Committed จะถูกบันทึกลงในสื่อบันทึกข้อมูลที่ทนทาน (Durable storage) เช่น Hard disk และจะสามารถกู้คืนได้ในกรณีที่ระบบล้มเหลว

การใช้งาน Transaction ใน MySQL

MySQL สนับสนุน Transaction ผ่านคำสั่ง SQL ต่อไปนี้:

  • BEGIN TRANSACTION หรือ START TRANSACTION: เริ่มต้น Transaction ใหม่
  • COMMIT: ยืนยัน (Commit) การเปลี่ยนแปลงทั้งหมดใน Transaction และทำให้การเปลี่ยนแปลงนั้นคงอยู่ถาวร
  • ROLLBACK: ยกเลิก (Rollback) การเปลี่ยนแปลงทั้งหมดใน Transaction และกลับสู่สถานะเดิมก่อนเริ่ม Transaction

ตัวอย่างการใช้งาน Transaction ใน MySQL:

START TRANSACTION;

-- ลดจำนวนเงินในบัญชีผู้โอน
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;

-- เพิ่มจำนวนเงินในบัญชีผู้รับโอน
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;

-- ตรวจสอบว่าไม่มีข้อผิดพลาดเกิดขึ้น
-- หากมีข้อผิดพลาด ให้ ROLLBACK
-- หากไม่มีข้อผิดพลาด ให้ COMMIT

COMMIT;

ในตัวอย่างนี้ เราเริ่มต้น Transaction ด้วย START TRANSACTION จากนั้นเราทำการ UPDATE สองครั้ง เพื่อลดจำนวนเงินในบัญชีผู้โอน และเพิ่มจำนวนเงินในบัญชีผู้รับโอน หากไม่มีข้อผิดพลาดเกิดขึ้น เราจะ COMMIT Transaction เพื่อยืนยันการเปลี่ยนแปลงทั้งหมด หากมีข้อผิดพลาดเกิดขึ้น เราจะ ROLLBACK Transaction เพื่อยกเลิกการเปลี่ยนแปลงทั้งหมด

ตัวอย่างการใช้งาน ROLLBACK เมื่อเกิดข้อผิดพลาด:

START TRANSACTION;

-- ลดจำนวนเงินในบัญชีผู้โอน
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;

-- (สมมติว่าเกิดข้อผิดพลาดขึ้นที่นี่)
-- เช่น บัญชีผู้รับโอนไม่มีอยู่จริง

-- ยกเลิก Transaction
ROLLBACK;

ในตัวอย่างนี้ หากเกิดข้อผิดพลาดขึ้นหลังจากที่เราลดจำนวนเงินในบัญชีผู้โอนแล้ว เราจะ ROLLBACK Transaction เพื่อยกเลิกการเปลี่ยนแปลง และเงินจะยังคงอยู่ในบัญชีผู้โอน

ข้อควรระวัง: อย่าลืม COMMIT หรือ ROLLBACK Transaction เสมอ เมื่อ Transaction เสร็จสิ้น หากคุณไม่ทำเช่นนั้น Transaction จะยังคงเปิดอยู่ และอาจทำให้เกิดปัญหา Lock และประสิทธิภาพลดลง

แนวปฏิบัติที่ดี: ใช้ try-catch block ในภาษาโปรแกรมมิ่งของคุณ เพื่อจัดการกับข้อผิดพลาดที่อาจเกิดขึ้นระหว่าง Transaction และ ROLLBACK Transaction ในกรณีที่เกิดข้อผิดพลาด

สรุป

Transaction เป็นเครื่องมือที่สำคัญสำหรับการจัดการความสมบูรณ์ของข้อมูลในฐานข้อมูล Transaction ช่วยให้มั่นใจได้ว่าชุดคำสั่ง SQL จะถูกดำเนินการเป็นหน่วยงานเดียวที่สมบูรณ์ (Atomic unit of work) และจะรักษาคุณสมบัติ ACID ซึ่งเป็นหัวใจสำคัญของการจัดการฐานข้อมูลที่มีความน่าเชื่อถือ ในบทต่อไป เราจะเจาะลึกถึงคำสั่ง BEGIN TRANSACTION, COMMIT และ ROLLBACK มากยิ่งขึ้น

Office.in.th Custom Service

この構成をもとにシステムを開発・カスタマイズしたいですか?

Office.in.th は、エンタープライズ Web アプリケーション、API 連携、官民の業務管理システムの設計・開発を承り、長期的なサポートも提供します。

ソフトウェア開発サービスを見る