• ติดตามบน
เรียนรู้ Transaction ใน SQL (MySQL) เข้าใจ COMMIT, ROLLBACK และ SAVEPOINT ใน 10 นาที

เรียนรู้ Transaction ใน SQL (MySQL) เข้าใจ COMMIT, ROLLBACK และ SAVEPOINT ใน 10 นาที

Chalothorn Kosakul 14 กรกฎาคม 2569 27 ครั้ง

เรียนรู้ 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: ตัดสต็อกสินค้าออก 1 ชิ้น (เหลือ 9 ชิ้น)
  2. ขั้นตอนที่ 2: บันทึกรายการสั่งซื้อใหม่ (Order) ลงในฐานข้อมูล
🔴 ถ้าไม่มี Transaction แล้วระบบเกิดล่ม (Crash) หลังจบขั้นตอนที่ 1:
  • สินค้าในคลัง ถูกตัดสต็อกไปแล้ว เหลือ 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_idproduct_namestock
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

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

SAVEPOINT vs ROLLBACK

หัวข้อSAVEPOINTROLLBACK
การย้อนกลับย้อนกลับเฉพาะบางส่วน (เช่น ยกเลิกเฉพาะของแถม)ยกเลิกทั้งหมดทั้ง Transaction (ทั้งออเดอร์)
จำนวนใน 1 งานมีได้หลายจุดตามต้องการมีจุดเดียวคือจุดเริ่มต้น Transaction
ความเหมาะสมงานที่มีหลายขั้นตอนซับซ้อนงานที่ต้องทำสำเร็จทั้งหมดเท่านั้น

⚠️ ข้อควรระวังในการใช้งาน Transaction

  1. อย่าลืมสั่ง COMMIT หรือ ROLLBACK: หากเปิด START TRANSACTION ค้างไว้ ระบบอาจจะไม่บันทึกข้อมูล และกระทบต่อผู้ใช้งานคนอื่น
  2. ระวังเรื่อง Database Lock: การเปิด Transaction ค้างไว้นาน ๆ จะทำการ Lock แถวสินค้า (Rows) นั้นไว้ ทำให้ลูกค้าคนอื่นไม่สามารถกดซื้อสินค้าเดียวกันได้ ส่งผลให้ระบบช้าหรือเกิด Deadlock ได้

🎯 แบบฝึกหัดทบทวนความเข้าใจ

ลองฝึกเขียนคำสั่งเพื่อทดสอบความเข้าใจของคุณ:

  1. สร้างตาราง products และเพิ่มข้อมูลสินค้าตัวอย่าง 3 ชิ้น
  2. เขียนคำสั่งซื้อสินค้าและตัดสต็อกโดยใช้ START TRANSACTION และ COMMIT
  3. ทดลองตัดสต็อกแล้วสั่ง ROLLBACK จากนั้นใช้คำสั่ง SELECT เพื่อดูว่าสต็อกสินค้าเปลี่ยนหรือไม่
  4. ลองสร้าง SAVEPOINT ก่อนเพิ่มสินค้าของแถม แล้วสั่ง ROLLBACK TO SAVEPOINT สังเกตผลลัพธ์ที่ได้
  5. อธิบายคุณสมบัติ ACID ทั้ง 4 ข้อด้วยภาษาของคุณเอง
  6. ออกแบบชุด Transaction สำหรับ "ระบบยืม-คืนหนังสือ" ว่าควรมีขั้นตอนใดบ้างที่ต้องอยู่ใน Transaction เดียวกัน
  7. ออกแบบ Transaction สำหรับ "ระบบจองห้องพักโรงแรม" พร้อมระบุจุดที่ควรวาง SAVEPOINT

แชร์บทความนี้