เรียนรู้ Transaction ใน SQL (MySQL) เข้าใจ COMMIT, ROLLBACK และ SAVEPOINT ใน 10 นาที
เวลาที่คุณกดสั่งซื้อสินค้าในแอปช้อปปิ้งออนไลน์ เคยสงสัยไหมว่าทำไมระบบถึง "ไม่เคยตัดสต็อกฟรี" ประเภทที่ว่าสินค้าโดนตัดออกจากคลังไปแล้ว แต่กลับไม่มีรายการสั่งซื้อเกิดขึ้น?
เบื้องหลังความถูกต้องและความแม่นยำระดับ 100% นี้ คือกลไกที่เรียกว่า Transaction (ธุรกรรม) ในระบบฐานข้อมูล บทความนี้จะพาคุณไปเจาะลึกว่า Transaction คืออะไร ทำงานอย่างไร และใช้อย่างไรในภาษา SQL (MySQL)
1. Transaction คืออะไร?
ในการทำงานกับระบบฐานข้อมูล (Database) หลายคำสั่งมักจะต้องทำงาน เกี่ยวข้องกันเป็นชุด เช่น การสั่งซื้อสินค้า การจองตั๋วเครื่องบิน หรือการลงทะเบียนเรียน
Transaction คือ การรวบรวมกลุ่มคำสั่ง SQL หลาย ๆ คำสั่ง เข้าด้วยกัน แล้วมองว่าเป็น "งานชิ้นเดียวกัน"
- หากสำเร็จทั้งหมด: ระบบจะบันทึกข้อมูลลงฐานข้อมูลจริง
- หากมีจุดไหนผิดพลาด: ระบบจะย้อนกลับ (Rollback) ข้อมูลทั้งหมด ให้กลับไปสู่สถานะเดิมเสมือนไม่เคยเกิดอะไรขึ้น
หลักการสำคัญ: "ทำสำเร็จทั้งหมด หรือไม่ก็ไม่ต้องทำเลย"
ตัวอย่างระบบที่ต้องใช้ Transaction:
- ร้านค้าออนไลน์: ตัดสต็อกสินค้า + สร้างคำสั่งซื้อ + เพิ่มคะแนนสะสม
- ระบบคลังสินค้า: โยกย้ายสินค้าจากคลัง A ไปคลัง B (ลดคลัง A + เพิ่มคลัง B)
- ระบบลงทะเบียนเรียน: เพิ่มชื่อนักศึกษาในวิชา + ลดจำนวนที่นั่งว่างในคลาส
2. ทำไมถึงขาด Transactionไม่ได้? (โจทย์ชีวิตจริง)
สมมติสถานการณ์ลูกค้าสั่งซื้อ **หูฟังบลูทูธ 1 ชิ้น** ในร้านค้าออนไลน์:
- สินค้าในคลังปัจจุบันเหลือ
10ชิ้น
ลำดับการทำงานของระบบในการสั่งซื้อจะเป็นดังนี้:
- ขั้นตอนที่ 1: ตัดสต็อกสินค้าออก 1 ชิ้น (เหลือ 9 ชิ้น)
- ขั้นตอนที่ 2: บันทึกรายการสั่งซื้อใหม่ (Order) ลงในฐานข้อมูล
- สินค้าในคลัง ถูกตัดสต็อกไปแล้ว เหลือ 9 ชิ้น
- แต่ระบบ ไม่ได้สร้างออเดอร์ ให้ลูกค้า
- ผลลัพธ์: สินค้าหายไปจากคลังฟรี ๆ 1 ชิ้น โดยไม่มีประวัติสั่งซื้อ ข้อมูลผิดพลาดทันที!
การนำ Transaction เข้ามาควบคุม จะช่วยการันตีได้ว่า หากขั้นตอนที่ 2 ไม่สำเร็จ ขั้นตอนที่ 1 (การตัดสต็อก) ก็จะถูกย้อนกลับและยกเลิกไปด้วยทันที
3. หัวใจของ Transaction: คุณสมบัติ ACID
Transaction ที่ดีและมีความน่าเชื่อถือ ต้องมีคุณสมบัติครบ 4 ประการ ซึ่งเรียกว่า ACID:
| คุณสมบัติ | ความหมาย | คำอธิบาย |
|---|---|---|
| A - Atomicity | ความเป็นหน่วยย่อยเดียว | ทุกคำสั่งใน Transaction ต้องสำเร็จทั้งหมด หรือยกเลิกทั้งหมด (All or Nothing) |
| C - Consistency | ความถูกต้องของข้อมูล | ข้อมูลต้องถูกต้องตามกฎเกณฑ์ (Constraints) ของฐานข้อมูลทั้งก่อนและหลังทำ Transaction เช่น สต็อกต้องไม่ติดลบ |
| I - Isolation | ความเป็นอิสระ | การซื้อสินค้าของลูกค้าหลาย ๆ คนพร้อมกันจะไม่รบกวนหรือแย่งตัดสต็อกกันจนผิดพลาด |
| D - Durability | ความคงทนถาวร | เมื่อบันทึกสำเร็จ (COMMIT) แล้ว ข้อมูลออเดอร์และสต็อกจะคงอยู่ถาวร แม้เซิร์ฟเวอร์จะไฟดับในภายหลัง |
4. เตรียมข้อมูลตัวอย่าง
มาลองลงมือทำไปพร้อมกัน โดยสร้างตารางสินค้า products และใส่ข้อมูลตัวอย่าง:
-- Create Products Table
CREATE TABLE products (
product_id INT PRIMARY KEY,
product_name VARCHAR(100),
stock INT
);
-- Insert Initial Products
INSERT INTO products VALUES
(1, 'หูฟังไร้สาย', 10),
(2, 'เมาส์เกมมิ่ง', 5);ตารางข้อมูลสินค้าเริ่มต้น:
| product_id | product_name | stock |
|---|---|---|
| 1 | หูฟังไร้สาย | 10 |
| 2 | เมาส์เกมมิ่ง | 5 |
5. คำสั่งควบคุม Transaction หลัก
🟢 1. COMMIT (บันทึกข้อมูลถาวร)
ใช้เมื่อชุดคำสั่งทำงานถูกต้องทั้งหมด เพื่อบันทึกการเปลี่ยนแปลงลงฐานข้อมูลจริง
โครงสร้าง:
START TRANSACTION;
-- ชุดคำสั่ง SQL
COMMIT;ตัวอย่างการใช้งาน (ตัดสต็อก + เพิ่มรายการสั่งซื้อ):
START TRANSACTION;
-- ตัดสต็อกหูฟังไร้สาย ออก 1 ชิ้น
UPDATE products SET stock = stock - 1 WHERE product_id = 1;
-- เพิ่มสต็อกเมาส์เกมมิ่ง เข้ามา 1 ชิ้น (เช่น มีการรับคืนสินค้า)
UPDATE products SET stock = stock + 1 WHERE product_id = 2;
COMMIT; -- บันทึกข้อมูลลงฐานข้อมูลถาวร*ผลลัพธ์หลัง COMMIT: หูฟังไร้สายเหลือ 9 ชิ้น / เมาส์เกมมิ่งเพิ่มเป็น 6 ชิ้น (ไม่สามารถ ROLLBACK ย้อนกลับได้แล้ว)*
🔴 2. ROLLBACK (ยกเลิกการเปลี่ยนแปลง)
ใช้ยกเลิกการเปลี่ยนแปลงทั้งหมดที่เกิดขึ้นนับตั้งแต่วางคำสั่ง START TRANSACTION
ตัวอย่างการใช้งาน:
START TRANSACTION;
-- ตัดสต็อกหูฟังไร้สาย ออก 1 ชิ้น
UPDATE products SET stock = stock - 1 WHERE product_id = 1;
-- เกิดข้อผิดพลาดในระบบสั่งซื้อ จึงสั่งย้อนกลับทั้งหมด
ROLLBACK;*ผลลัพธ์หลัง ROLLBACK: หูฟังไร้สายยังมีสต็อก 10 ชิ้นเท่าเดิม สต็อกไม่โดนตัดฟรี*
🟡 3. SAVEPOINT & ROLLBACK TO SAVEPOINT (สร้างจุดบันทึกชั่วคราว)
ในบางกรณี งานของเรามีหลายขั้นตอนมาก เช่น การสั่งซื้อที่มีการแจกของแถมเสริม หากขั้นตอนของแถมมีปัญหา เราอาจจะไม่อยากยกเลิกออเดอร์หลัก แต่ย้อนกลับไปแค่ **ขั้นตอนของแถม** โดยใช้ **SAVEPOINT** ช่วยได้
ตัวอย่างการใช้งาน:
START TRANSACTION;
-- ขั้นตอนที่ 1: ตัดสต็อกสินค้าหลัก (หูฟังไร้สาย)
UPDATE products SET stock = stock - 1 WHERE product_id = 1;
-- สร้างจุดบันทึกชื่อ step1
SAVEPOINT step1;
-- ขั้นตอนที่ 2: ตัดสต็อกสินค้าของแถม (เมาส์เกมมิ่ง)
UPDATE products SET stock = stock - 1 WHERE product_id = 2;
-- สินค้าของแถมหมด เกิดข้อผิดพลาด จึงถอยกลับไปแค่จุด step1
ROLLBACK TO step1;
COMMIT;ผลลัพธ์:
- การตัดสต็อกเมาส์เกมมิ่ง (ขั้นตอนของแถม) ถูกยกเลิก
- แต่คำสั่งตัดสต็อกหูฟังไร้สาย (สินค้าหลัก) ยังคงอยู่และถูก COMMIT บันทึกสำเร็จ
(หมายเหตุ: หากต้องการลบจุด SAVEPOINT ที่ไม่ใช้แล้ว สามารถใช้คำสั่ง RELEASE SAVEPOINT point_name; ได้)
6. สรุปภาพรวมการทำงาน (Flow Chart)

กระบวนการทำงานของ SQL Transaction. แหล่งที่มา: Baeldung / Commit, Rollback, Savepoint in MySQL Baeldung on SQL
7. ตารางเปรียบเทียบความแตกต่าง
COMMIT vs ROLLBACK
| หัวข้อ | COMMIT | ROLLBACK |
|---|---|---|
| การทำงาน | บันทึกการเปลี่ยนแปลงถาวร | ยกเลิกการเปลี่ยนแปลงทั้งหมด |
| การย้อนกลับ | ไม่สามารถย้อนกลับได้ | ย้อนกลับสู่สถานะเริ่มต้น Transaction |
| บริบทที่ใช้ | ใช้เมื่อสั่งซื้อและตัดสต็อกสำเร็จ | ใช้เมื่อระบบล่มหรือสินค้าไม่พอ |
SAVEPOINT vs ROLLBACK
| หัวข้อ | SAVEPOINT | ROLLBACK |
|---|---|---|
| การย้อนกลับ | ย้อนกลับเฉพาะบางส่วน (เช่น ยกเลิกเฉพาะของแถม) | ยกเลิกทั้งหมดทั้ง Transaction (ทั้งออเดอร์) |
| จำนวนใน 1 งาน | มีได้หลายจุดตามต้องการ | มีจุดเดียวคือจุดเริ่มต้น Transaction |
| ความเหมาะสม | งานที่มีหลายขั้นตอนซับซ้อน | งานที่ต้องทำสำเร็จทั้งหมดเท่านั้น |
⚠️ ข้อควรระวังในการใช้งาน Transaction
- อย่าลืมสั่ง COMMIT หรือ ROLLBACK: หากเปิด
START TRANSACTIONค้างไว้ ระบบอาจจะไม่บันทึกข้อมูล และกระทบต่อผู้ใช้งานคนอื่น - ระวังเรื่อง Database Lock: การเปิด Transaction ค้างไว้นาน ๆ จะทำการ Lock แถวสินค้า (Rows) นั้นไว้ ทำให้ลูกค้าคนอื่นไม่สามารถกดซื้อสินค้าเดียวกันได้ ส่งผลให้ระบบช้าหรือเกิด Deadlock ได้
🎯 แบบฝึกหัดทบทวนความเข้าใจ
ลองฝึกเขียนคำสั่งเพื่อทดสอบความเข้าใจของคุณ:
- สร้างตาราง
productsและเพิ่มข้อมูลสินค้าตัวอย่าง 3 ชิ้น - เขียนคำสั่งซื้อสินค้าและตัดสต็อกโดยใช้
START TRANSACTIONและCOMMIT - ทดลองตัดสต็อกแล้วสั่ง
ROLLBACKจากนั้นใช้คำสั่งSELECTเพื่อดูว่าสต็อกสินค้าเปลี่ยนหรือไม่ - ลองสร้าง
SAVEPOINTก่อนเพิ่มสินค้าของแถม แล้วสั่งROLLBACK TO SAVEPOINTสังเกตผลลัพธ์ที่ได้ - อธิบายคุณสมบัติ ACID ทั้ง 4 ข้อด้วยภาษาของคุณเอง
- ออกแบบชุด Transaction สำหรับ "ระบบยืม-คืนหนังสือ" ว่าควรมีขั้นตอนใดบ้างที่ต้องอยู่ใน Transaction เดียวกัน
- ออกแบบ Transaction สำหรับ "ระบบจองห้องพักโรงแรม" พร้อมระบุจุดที่ควรวาง
SAVEPOINT
