ลองใช้ SQL Transaction กับ PHP PDO

Sept. 14, 2024 · boychawin

วันนี้ผมได้มีโอกาสกลับมา 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 ให้ทำงานเป็นหนึ่งเดียว ถ้าสำเร็จก็สำเร็จไปเลย ถ้าล้มเหลวก็ยกเลิกทุกอย่าง เพื่อให้ข้อมูลในฐานข้อมูลปลอดภัยและถูกต้องเสมอ