วันนี้ผมได้มีโอกาสกลับมา dev โปรเจกต์ที่เคยทำไว้สมัยฝึกงานที่ยังมีการใช้งานอยู่ ซึ่งตอนนั้นก็ต้องบอกว่า เราก็ยังไม่เคยลองใช้ SQL Transaction เลย รอบนี้ได้กลับมาเลยถือโอกาสลองใส่เข้าไปเลยล่ะกัน จึงเป็นที่มาของบทความนี้ครับ 🤣
Transaction คือการทำธุรกรรมให้เสร็จ หรือ ยกเลิกทั้งหมด เพื่อให้ข้อมูลในฐานข้อมูลไม่เสียหาย(แบบสั้นๆ)
ตัวอย่างโค้ด PHP PDO ที่ใช้ Transaction
<?php
try {
// เชื่อมต่อฐานข้อมูล
$pdo = new PDO("mysql:host=localhost;dbname=mystore", "username", "password");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// เริ่มต้น Transaction
$pdo->beginTransaction();
// ลดจำนวนสินค้าในคลัง
$stmt = $pdo->prepare("UPDATE products SET quantity = quantity - :quantity WHERE id = :product_id");
$stmt->execute([':quantity' => 1, ':product_id' => 123]); // สมมติว่า product_id ของสินค้าคือ 123 และสั่งซื้อ 1 ชิ้น
// เพิ่มข้อมูลการสั่งซื้อในตาราง orders
$stmt = $pdo->prepare("INSERT INTO orders (user_id, product_id, quantity) VALUES (?, ?, ?)");
$stmt->execute([1, 123, 1]); // สมมติว่า user_id ของลูกค้าคือ 1
// อัปเดตยอดขายของสินค้า (เพิ่มจำนวนขาย)
$stmt = $pdo->prepare("UPDATE products SET sales = sales + :quantity WHERE id = :product_id");
$stmt->execute([':quantity' => 1, ':product_id' => 123]);
// ยืนยันการ Update ทั้งหมดใน Transaction
$pdo->commit();
echo "การสั่งซื้อสำเร็จ";
} catch (PDOException $e) {
// ยกเลิกการ Update หากมีข้อผิดพลาด
$pdo->rollBack();
echo "เกิดข้อผิดพลาดในการสั่งซื้อ: " . $e->getMessage();
}
ทำไมต้องใช้ Transaction?
- ทำให้ข้อมูลในฐานข้อมูลถูกต้องเสมอ
- ป้องกันไม่ให้ข้อมูลเสียหาย
- มั่นใจได้ว่าการ Update ข้อมูลจะเสร็จสมบูรณ์
ข้อควรระวัง
- การใช้ Transaction จะใช้ทรัพยากรของฐานข้อมูลมากขึ้น
- โค้ดอาจซับซ้อนขึ้นเล็กน้อย
- ใช้ Transaction เมื่อจำเป็น ไม่ควรใช้ Transaction กับทุกคำสั่ง SQL เพราะจะทำให้ระบบทำงานช้าลง
- จัดการ Deadlock: ระบบฐานข้อมูลส่วนใหญ่มีกลไกในการจัดการ Deadlock อยู่แล้ว แต่ก็ควรเขียนโค้ดให้ดีเพื่อลดโอกาสเกิด Deadlock
สรุปง่ายๆ
Transaction คือการรวมกลุ่มคำสั่ง SQL ให้ทำงานเป็นหนึ่งเดียว ถ้าสำเร็จก็สำเร็จไปเลย ถ้าล้มเหลวก็ยกเลิกทุกอย่าง เพื่อให้ข้อมูลในฐานข้อมูลปลอดภัยและถูกต้องเสมอ