在php中操作mysql实现事务回滚,核心是调用pdo或mysqli对象的`begintransaction()`开启事务,执行sql后通过`commit()`提交,若发生异常则捕获并调用`rollback()`撤销更改。推荐使用pdo的`setattribute(pdo::attr_errmode, pdo::errmode_exception)`开启异常模式,这样当sql出错时会自动抛出异常,从而触发catch块中的回滚逻辑,确保数据一致性。

PDO开启异常模式后如何自动触发回滚
当配置了异常模式,任何SQL语法错误或约束冲突都会抛出PDOException,此时无需手动检查返回值,直接利用try-catch结构即可实现自动回滚。关键在于必须显式调用`beginTransaction()`,否则默认自动提交模式下的语句无法被撤销。

$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
try {
$pdo->beginTransaction();
// 模拟业务逻辑:转账
$pdo->exec("UPDATE accounts SET balance = balance - 100 WHERE id = 1");
$pdo->exec("UPDATE accounts SET balance = balance + 100 WHERE id = 2");
// 假设这里发生错误,例如id=2不存在导致外键或主键冲突
// 或者人为制造错误
if (true) { throw new Exception('Simulated Error'); }
$pdo->commit();
echo 'Transaction committed successfully.';
} catch (Exception $e) {
$pdo->rollBack();
echo 'Transaction rolled back: ' . $e->getMessage();
}
mysqli扩展中如何手动控制事务状态
使用mysqli时,没有内置的异常模式来自动中断流程,需要手动判断每条语句的执行结果或在最后统一处理。通常做法是先关闭自动提交(`autocommit(false)`),执行多条语句,若任一环节失败或最终条件不满足,则调用`rollback()`,否则调用`commit()`。这种方式更灵活但代码量稍大,适合需要精细控制每一步状态的场景。
安装、修复、更新或打包一个基于 Python 和 PyMySQL 实现的 Windows `mysql` 命令。适用于用户希望在 PowerShell/CMD 中输入 `mysql` 时重定向到 Python 实现、需要交互式输入 MySQL 连接信息、需要同步到当前用户本地 bin 目录,或需要将该能力封装成可公开复用的 Codex skill。

$mysqli = new mysqli('localhost', 'user', 'pass', 'test');
if ($mysqli->connect_error) {
die('Connect Error (' . $mysqli->connect_errno . ') ' . $mysqli->connect_error);
}
$mysqli->autocommit(FALSE);
$sql1 = "UPDATE accounts SET balance = balance - 100 WHERE id = 1";
$sql2 = "UPDATE accounts SET balance = balance + 100 WHERE id = 2";
if ($mysqli->query($sql1) && $mysqli->query($sql2)) {
if ($mysqli->commit()) {
echo 'Transaction committed successfully.';
} else {
echo 'Commit failed: ' . $mysqli->error;
}
} else {
echo 'Query failed: ' . $mysqli->error;
}
$mysqli->autocommit(TRUE); // 恢复自动提交
$mysqli->close();
如果SQL执行成功但业务逻辑判断失败是否应该回滚
是的,即使SQL语句本身没有报错,如果后续的业务逻辑校验失败(如余额不足、库存为负等),也必须调用`rollback()`。因为之前的SQL修改已经暂存在事务缓冲区中,只有显式提交才会生效。若在业务判断失败后未调用回滚而直接结束脚本,这些修改将不会自动撤销,除非脚本结束后连接断开且事务超时,但这会导致数据处于不一致状态。因此,必须在所有退出点(包括正常提交前和异常分支)确保要么commit要么rollback。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










