เวลาที่คุณกดสั่งซื้อสินค้าในแอปช้อปปิ้งออนไลน์ เคยสงสัยไหมว่าทำไมระบบถึง "ไม่เคยตัดสต็อกฟรี" ประเภทที่ว่าสินค้าโดนตัดออกจากคลังไปแล้ว แต่กลับไม่มีรายการสั่งซื้อเกิดขึ้น?
เบื้องหลังความถูกต้องและความแม่นยำระดับ 100% นี้ คือกลไกที่เรียกว่า Transaction (ธุรกรรม) ในระบบฐานข้อมูล บทความนี้จะพาคุณไปเจาะลึกว่า Transaction คืออะไร ทำงานอย่างไร และใช้อย่างไรในภาษา SQL (MySQL)
ในการทำงานกับระบบฐานข้อมูล (Database) หลายคำสั่งมักจะต้องทำงาน เกี่ยวข้องกันเป็นชุด เช่น การสั่งซื้อสินค้า การจองตั๋วเครื่องบิน หรือการลงทะเบียนเรียน
Transaction คือ การรวบรวมกลุ่มคำสั่ง SQL หลาย ๆ คำสั่ง เข้าด้วยกัน แล้วมองว่าเป็น "งานชิ้นเดียวกัน"
หลักการสำคัญ: "ทำสำเร็จทั้งหมด หรือไม่ก็ไม่ต้องทำเลย"
สมมติสถานการณ์ลูกค้าสั่งซื้อ **หูฟังบลูทูธ 1 ชิ้น** ในร้านค้าออนไลน์:
10 ชิ้นลำดับการทำงานของระบบในการสั่งซื้อจะเป็นดังนี้:
การนำ Transaction เข้ามาควบคุม จะช่วยการันตีได้ว่า หากขั้นตอนที่ 2 ไม่สำเร็จ ขั้นตอนที่ 1 (การตัดสต็อก) ก็จะถูกย้อนกลับและยกเลิกไปด้วยทันที
Transaction ที่ดีและมีความน่าเชื่อถือ ต้องมีคุณสมบัติครบ 4 ประการ ซึ่งเรียกว่า ACID:
มาลองลงมือทำไปพร้อมกัน โดยสร้างตารางสินค้า 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);ตารางข้อมูลสินค้าเริ่มต้น:
ใช้เมื่อชุดคำสั่งทำงานถูกต้องทั้งหมด เพื่อบันทึกการเปลี่ยนแปลงลงฐานข้อมูลจริง
โครงสร้าง:
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 ย้อนกลับได้แล้ว)*
ใช้ยกเลิกการเปลี่ยนแปลงทั้งหมดที่เกิดขึ้นนับตั้งแต่วางคำสั่ง START TRANSACTION
ตัวอย่างการใช้งาน:
START TRANSACTION;
-- ตัดสต็อกหูฟังไร้สาย ออก 1 ชิ้น
UPDATE products SET stock = stock - 1 WHERE product_id = 1;
-- เกิดข้อผิดพลาดในระบบสั่งซื้อ จึงสั่งย้อนกลับทั้งหมด
ROLLBACK;*ผลลัพธ์หลัง ROLLBACK: หูฟังไร้สายยังมีสต็อก 10 ชิ้นเท่าเดิม สต็อกไม่โดนตัดฟรี*
ในบางกรณี งานของเรามีหลายขั้นตอนมาก เช่น การสั่งซื้อที่มีการแจกของแถมเสริม หากขั้นตอนของแถมมีปัญหา เราอาจจะไม่อยากยกเลิกออเดอร์หลัก แต่ย้อนกลับไปแค่ **ขั้นตอนของแถม** โดยใช้ **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;ผลลัพธ์:
(หมายเหตุ: หากต้องการลบจุด SAVEPOINT ที่ไม่ใช้แล้ว สามารถใช้คำสั่ง RELEASE SAVEPOINT point_name; ได้)

กระบวนการทำงานของ SQL Transaction. แหล่งที่มา: Baeldung / Commit, Rollback, Savepoint in MySQL Baeldung on SQL
START TRANSACTION ค้างไว้ ระบบอาจจะไม่บันทึกข้อมูล และกระทบต่อผู้ใช้งานคนอื่นลองฝึกเขียนคำสั่งเพื่อทดสอบความเข้าใจของคุณ:
products และเพิ่มข้อมูลสินค้าตัวอย่าง 3 ชิ้นSTART TRANSACTION และ COMMITROLLBACK จากนั้นใช้คำสั่ง SELECT เพื่อดูว่าสต็อกสินค้าเปลี่ยนหรือไม่SAVEPOINT ก่อนเพิ่มสินค้าของแถม แล้วสั่ง ROLLBACK TO SAVEPOINT สังเกตผลลัพธ์ที่ได้SAVEPOINT