php中事务处理需显式开启:pdo须设异常模式、调用begintransaction(),mysqli须先autocommit(false);均需配合try-catch或手动检查错误,确保commit()或rollback()执行,且仅innodb引擎生效。

PHP 中事务处理不是自动开启的,必须显式控制连接、手动开启、提交或回滚,且仅对支持事务的存储引擎(如 InnoDB)生效。MyISAM 表无论怎么写 START TRANSACTION 都不会真正回滚。
如何正确开启并管理 MySQL 事务(PDO 方式)
PDO 默认是自动提交模式,每次执行 SQL 都立即生效。要启用事务,必须先关闭自动提交,再用 beginTransaction() 显式开启;否则 commit() 和 rollback() 不起作用。
-
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION)必须设置,否则事务中出错不会抛异常,rollback()容易被跳过 - 事务块内所有操作必须使用同一个
PDO实例,跨连接或新实例无法参与同一事务 - 不要在事务中调用非事务性操作(如写文件、发 HTTP 请求),它们无法回滚,会破坏数据一致性
$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");
$pdo->commit();
} catch (Exception $e) {
$pdo->rollback();
throw $e;
}
mysqli 中事务控制的关键点(面向对象风格)
mysqli 的事务行为和 PDO 差异明显:它不依赖异常模式,但要求显式检查每条语句是否成功;autocommit(false) 是前提,漏掉就等于没开事务。
-
$mysqli->autocommit(false)必须在第一条业务 SQL 前调用,之后才能用commit()/rollback() - 不能混用
query()和execute()后不检查返回值——失败时它们返回false,但不会中断后续执行 -
mysqli不支持嵌套事务,START TRANSACTION多次执行只会隐式提交前一个事务
$mysqli = new mysqli('localhost', $user, $pass, 'test');
$mysqli->autocommit(false);
if (!$mysqli->query("UPDATE accounts SET balance = balance - 50 WHERE id = 1")) {
$mysqli->rollback();
exit('First update failed');
}
if (!$mysqli->query("UPDATE accounts SET balance = balance + 50 WHERE id = 2")) {
$mysqli->rollback();
exit('Second update failed');
}
$mysqli->commit();
哪些情况会导致事务“看似成功”实则失效
事务失败往往不报错,而是静默降级为多条独立语句执行,尤其容易在以下场景中误判:
- 表引擎是 MyISAM ——
SHOW CREATE TABLE accounts查看ENGINE=InnoDB才可靠 - SQL 语法错误或字段不存在,但用了
or die()而非异常捕获,rollback()根本没机会运行 - 事务中执行了 DDL(如
CREATE TABLE、ALTER TABLE),MySQL 会自动提交当前事务 - 连接超时或脚本被 kill,未执行
commit()或rollback(),连接断开后事务自动回滚,但业务逻辑可能已做其他不可逆操作
事务的核心约束不在 PHP 层,而在数据库连接状态、表结构定义和语句执行路径上。少一个 autocommit(false),或建表时忘了写 ENGINE=InnoDB,整个事务块就形同虚设。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











