事務是一組操作的集合,遵循 ACID 原則:要麼全成功,要麼全失敗。MySQL 需使用 InnoDB 引擎(最常用)或 BDB 支援事務。
<?php
try {
$pdo = new PDO("mysql:host=localhost;dbname=psp", "root", "");
$pdo->exec("SET NAMES utf8");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, 0); // 關鍵:關閉自動提交
} catch (PDOException $e) {
die("數據庫連接失敗: " . $e->getMessage());
}
try {
$age = 10;
$pdo->beginTransaction(); // 開啟事務
$affected1 = $pdo->exec("UPDATE kfry SET k_age = k_age + $age WHERE k_name = 'user1'");
$affected2 = $pdo->exec("UPDATE kfry SET k_age = k_age - $age WHERE k_name = 'user2'");
// 異常觸發回滾
if (!$affected1) throw new PDOException("加款失敗");
if (!$affected2) throw new PDOException("扣款失敗");
echo "操作成功";
$pdo->commit(); // 提交事務
} catch (PDOException $e) {
echo "操作失敗: " . $e->getMessage();
$pdo->rollback(); // 回滾事務
}
$pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, 1); // 恢復自動提交
ATTR_AUTOCOMMIT = 0 是事務生效前提ERRMODE_EXCEPTION 讓 SQL 錯誤拋出異常,便於統一捕獲catch 塊執行 rollback()生產環境建議:對關鍵業務(轉賬、扣庫存)務必使用事務,並添加死鎖重試機制。