MySQL 事務是保證資料一致性的核心機制,但許多開發者因引擎不支援、語法錯誤或自動提交模式誤解而導致回滾失效。本文系統梳理兩種事務模式、引擎啟用步驟與實戰代碼範本。
BEGIN; -- 或 START TRANSACTION;
-- SQL 操作...
COMMIT; -- 確認提交
ROLLBACK; -- 錯誤時回滾
特點:僅包裹當前批次操作,結束後自動恢復自動提交模式,邏輯清晰不易出錯。
SET autocommit=0; -- 關閉自動提交
-- 後續所有 SQL 均屬同一事務
COMMIT; -- 提交並隱式開啟新事務
ROLLBACK; -- 回滾並隱式開啟新事務
SET autocommit=1; -- 記得重新開啟!
⚠️ 陷阱:COMMIT/ROLLBACK 後會**隱式開啟新事務**,若忘記重新開啟 autocommit=1,後續查詢將意外進入事務模式。
**只有 InnoDB 和 BDB 支援事務**,預設 MyISAM **不支援**。啟用 InnoDB 步驟:
my.ini,註解 skip-InnoDB(前加 #)並儲存。services.msc → MySQL → 重新啟動)。SHOW ENGINES; 或 SHOW VARIABLES LIKE 'have_%'; 確認 InnoDB = YES。ENGINE=InnoDB;既有表轉換:ALTER TABLE t ENGINE=InnoDB;。$conn = mysqli_connect('localhost','root','root','test');
mysqli_set_charset($conn, 'utf8mb4');
mysqli_begin_transaction($conn); // 或 mysqli_query($conn, "START TRANSACTION");
$sql1 = "INSERT INTO `user` (`username`, `sex`) VALUES ('test1', '0')";
$sql2 = "INSERT INTO `user` (`username`, `sex`) VALUES ('test2', '1')"; // 故意寫錯欄位名測試回滾
$res1 = mysqli_query($conn, $sql1);
$res2 = mysqli_query($conn, $sql2);
if ($res1 && $res2) {
mysqli_commit($conn);
echo '提交成功。';
} else {
mysqli_rollback($conn);
echo '資料回滾:' . mysqli_error($conn);
}
mysqli_close($conn);
mysqli_query($conn, "SET AUTOCOMMIT=0");
// ... 同樣執行 SQL ...
if ($res1 && $res2) {
mysqli_commit($conn);
} else {
mysqli_rollback($conn);
}
mysqli_query($conn, "SET AUTOCOMMIT=1"); // 必須恢復!
BEGIN 與 autocommit=0 → 擇一使用autocommit=1 → 導致後續查詢卡住try-catch 使用 PDO 事務更安全掌握事務本質與引擎依賴,配合規範的代碼模式,才能真正守護資料完整性。