Transaction คือชุดคำสั่ง SQL ที่ต้องสำเร็จทั้งหมด หรือยกเลิกทั้งหมด เปรียบเสมือนการห่อกลุ่มคำสั่งสำคัญเข้าด้วยกัน เพื่อป้องกันข้อมูลผิดเพี้ยน (inconsistent) หากคำสั่งใดคำสั่งหนึ่งล้มเหลว
Transaction จึงเป็นหัวใจของระบบที่ต้องการความถูกต้อง 100% เช่น
- ระบบโอนเงิน
- ระบบขายสินค้า
- การอัปเดตหลายตารางพร้อมกัน
ประโยชน์ของการใช้ Transaction ใน Stored Procedure
- ป้องกันข้อมูลไม่สมบูรณ์เมื่อคำสั่งบางรายการล้มเหลว
- ควบคุมการเขียนหลายตารางให้เป็นหนึ่งเดียว
- เพิ่มความปลอดภัยในการอัปเดตข้อมูลสำคัญ
- ย้อนกลับ (Rollback) ได้เมื่อเกิดข้อผิดพลาด
รูปแบบคำสั่ง Transaction
SQL
START TRANSACTION; -- เริ่มธุรกรรม
-- คำสั่ง SQL หลายรายการที่ต้องทำพร้อมกัน
COMMIT; -- ยืนยันการเปลี่ยนแปลง (ถ้าทุกอย่างสำเร็จ)
ROLLBACK; -- ยกเลิกธุรกรรม (ถ้ามีข้อผิดพลาด)- ใช้ใน Stored Procedure ร่วมกับ
DECLARE HANDLERเพื่อดักจับ error
ตัวอย่างการใช้งาน
อัปเดตออเดอร์ และตัดสต๊อกสินค้าแบบปลอดภัย
เมื่อมีการยืนยันคำสั่งซื้อ เราต้อง
- เปลี่ยนสถานะออเดอร์เป็น “confirmed”
- หักจำนวนสินค้าออกจากคลัง
- หากรายการใดล้มเหลว ให้ยกเลิกทั้งหมด
สมมติว่ามีตาราง orders และตาราง products ซึ่งเก็บข้อมูลดังนี้
Stored Procedure
SQL
DELIMITER //
CREATE PROCEDURE confirm_order(
IN p_order_id INT,
IN p_product_id INT,
IN p_quantity INT
)
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
-- ถ้ามี error ให้ยกเลิกธุรกรรม
ROLLBACK;
END;
-- เริ่มธุรกรรม
START TRANSACTION;
-- อัปเดตสถานะคำสั่งซื้อ
UPDATE orders
SET status = 'confirmed'
WHERE order_id = p_order_id;
-- หักจำนวนสินค้า
UPDATE products
SET quantity = quantity - p_quantity
WHERE product_id = p_product_id;
-- ทุกอย่างสำเร็จ → ยืนยันการเปลี่ยนแปลง
COMMIT;
END //
DELIMITER ;การเรียกใช้งาน
SQL
CALL confirm_order(101, 1, 2);ผลลัพธ์ในตาราง orders
| order_id | status | product_id |
|---|---|---|
| 101 | confirmed | 1 |
ผลลัพธ์ในตาราง products
| product_id | quantity |
|---|---|
| 1 | 18 |
หมายเหตุ
COMMITต้องอยู่ท้ายสุด เมื่อแน่ใจว่าทุกคำสั่งสำเร็จ- ควรมี
ROLLBACKอยู่ในDECLARE HANDLERเสมอ - หากไม่ใช้
START TRANSACTIONการเปลี่ยนแปลงจะเกิดทันที (Auto-commit) - Transaction ทำงานได้เฉพาะกับ Engine แบบ
InnoDBเท่านั้น (ไม่รองรับใน MyISAM)