MyISAM、Memory等引擎不支持事務,這是選型時的硬性指標。InnoDB通過redo log(重做日誌)保證持久性、undo log(回滾日誌)實現原子性、MVCC實現隔離性。
BEGIN; -- 或 START TRANSACTION;
-- SQL語句群
COMMIT; -- 提交事務
ROLLBACK; -- 回滾事務
SET autocommit = 0; -- 禁用自動提交,開啟隱式事務
-- SQL語句群
COMMIT; -- 必須顯式提交
SET autocommit = 1; -- 恢復自動提交模式
關鍵區別:BEGIN只影響當前事務;SET autocommit=0影響整個會話後續所有操作,易忘記提交導致鎖持有過長,生產環境強烈建議使用顯式BEGIN/COMMIT。
<?php
$mysqli = new mysqli("localhost", "root", "", "test");
$mysqli->query("SET NAMES utf8");
try {
$mysqli->begin_transaction(); // PHP 5.5+ 推薦
$sql1 = "INSERT INTO `test` VALUES ('2222', '測試數據')";
$sql2 = "INSERT INTO `test` VALUES ('111', 'sss', '22')"; // 故意錯誤:列數不匹配
if (!$mysqli->query($sql1)) throw new Exception($mysqli->error);
if (!$mysqli->query($sql2)) throw new Exception($mysqli->error);
$mysqli->commit();
echo "事務提交成功";
} catch (Exception $e) {
$mysqli->rollback();
echo "事務回滾: " . $e->getMessage();
}
$mysqli->close();
autocommit=ON,單條SQL即提交。事務必須顯式BEGINERROR 1213重試rollback(),否則隱式提交導致數據不一致事務是數據一致性的基石,正確使用姿勢決定系統穩定性上限。