事务未生效需先确认autocommit是否被关闭:MySQLi/PDO默认开启,但begin_transaction后进入手动模式,必须显式commit/rollback;PDO须设ERRMODE_EXCEPTION防静默失败;MySQL中查INNODB_TRX可诊断卡住事务;MySQL不支持嵌套事务,应改用savepoint或统一事务边界。
PHP 中 MySQLi 或 PDO 默认开启自动提交(autocommit),但一旦执行 mysqli_begin_transaction() 或 $pdo->beginTransaction(),就进入手动事务模式——此后所有 SQL 都不会自动落库,直到显式调用 commit() 或 rollback()。常见错误是忘记写 commit(),或在异常分支里漏掉 rollback(),导致数据“消失”又查不到报错。
调试时第一件事:在事务块前后加日志,确认是否真的走到 commit();同时检查连接是否被复用且之前未清理状态。例如:
mysqli_begin_transaction($conn);
// ... 执行 insert/update
if ($success) {
mysqli_commit($conn); // 必须有
} else {
mysqli_rollback($conn); // 必须有,否则连接残留事务状态
}默认 PDO 错误模式是 PDO::ERRMODE_SILENT,SQL
报错只返回 false,不抛异常——这意味着事务中某条语句失败,后续语句仍会继续执行,commit() 也会照常调用,最终造成部分写入、部分丢弃,且无任何提示。
务必在创建 PDO 实例后立即设置:
$pdo = new PDO($dsn, $user, $pass); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
INSERT INTO xxx VALUES (...) ON DUPLICATE KEY UPDATE 出错会被吞掉PDOException 可直接被捕获并触发 rollback()
当 PHP 脚本崩溃、超时或被 nginx/fastcgi 终止,但 MySQL 连接未断开时,事务可能长期处于 ACTIVE 状态,阻塞其他操作。此时查不到 PHP 报错,但数据库变慢、SELECT ... FOR UPDATE 卡住、甚至出现死锁。
登录 MySQL 执行:
SELECT * FROM information_schema.INNODB_TRX\G
重点关注字段:
TRX_STATE = 'RUNNING' 但长时间不动 → 可能是 PHP 没 commit/rollbackTRX_MYSQL_THREAD_ID 对应线程 ID,可用 KILL [thread_id] 强制终止TRX_QUERY 显示当前执行语句,可判断卡在哪一步注意:InnoDB 事务不支持跨连接传播,START TRANSACTION 只对当前连接有效,别指望一个请求里的事务影响另一个请求。
MySQL 本身不支持真正的嵌套事务(savepoint 是替代方案,但不是事务)。PDO 或 MySQLi 的 beginTransaction() 在已存在事务时只是静默返回 true,不会新建事务上下文。所以以下代码看似“嵌套”,实则无效:
$pdo->beginTransaction(); // 外层 doSomething(); $pdo->beginTransaction(); // 内层 —— 实际什么也没做 doOtherThing(); $pdo->commit(); // 只提交一次,不是两次 $pdo->commit(); // 第二次 commit 会报错:There is no active transaction
正确做法是统一用 savepoint:
$pdo->exec("SAVEPOINT sp1");
// ... 出错时
$pdo->exec("ROLLBACK TO SAVEPOINT sp1");或者更简单:PHP 层用标志位管理事务生命周期,避免重复 begin;所有业务逻辑共用同一事务边界,不要在函数内部擅自 begin/commit。
事务调试最麻烦的从来不是语法,而是状态残留和边界模糊——连着跑两次脚本,第二次失败,很可能是因为第一次没 rollback 干净。每次修改都要重连数据库,或确保异常路径 100% 覆盖 rollback。
# mysql
# php
# nginx
# sql
# NULL
# for
# select
# mysqli
# pdo
# 线程
# 数据库
# 报错
# 不支持
# 两次
# 死锁
# 不设
# 是因为
# 也会
# 都要
# 走到
# 长时间
相关文章:
网站制作大概多少钱一个,做一个平台网站大概多少钱?
建站之星ASP如何实现CMS高效搭建与安全管理?
智能起名网站制作软件有哪些,制作logo的软件?
如何通过虚拟主机快速搭建个人网站?
建站之星如何实现五合一智能建站与营销推广?
南阳网站制作公司推荐,小学电子版试卷去哪里找资源好?
如何快速生成高效建站系统源代码?
网站制作价目表怎么做,珍爱网婚介费用多少?
安徽网站建设与外贸建站服务专业定制方案
建站之星如何快速解决建站难题?
昆明网站制作哪家好,昆明公租房申请网上登录入口?
高防服务器租用如何选择配置与防御等级?
济南网站制作的价格,历城一职专官方网站?
湖南网站制作公司,湖南上善若水科技有限公司做什么的?
建站主机服务器选购指南:轻量应用与VPS配置解析
公司网站建设制作费用,想建设一个属于自己的企业网站,该如何去做?
如何选择高效可靠的多用户建站源码资源?
ui设计制作网站有哪些,手机UI设计网址吗?
定制建站模板如何实现SEO优化与智能系统配置?18字教程
如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?
东莞专业制作网站的公司,东莞大学生网的网址是什么?
如何快速搭建FTP站点实现文件共享?
公司网站制作需要多少钱,找人做公司网站需要多少钱?
如何用IIS7快速搭建并优化网站站点?
简易网站制作视频教程,使用记事本编写一个简单的网页html文件?
视频网站app制作软件,有什么好的视频聊天网站或者软件?
娃派WAP自助建站:免费模板+移动优化,快速打造专业网站
建站之星CMS建站配置指南:模板选择与SEO优化技巧
建站之星如何一键生成手机站?
如何在阿里云完成域名注册与建站?
如何快速选择适合个人网站的云服务器配置?
制作网站的过程怎么写,用凡科建站如何制作自己的网站?
javascript中的try catch异常捕获机制用法分析
如何获取免费开源的自助建站系统源码?
高端网站建设与定制开发一站式解决方案 中企动力
无锡营销型网站制作公司,无锡网选车牌流程?
如何配置支付宝与微信支付功能?
网站网页制作专业公司,怎样制作自己的网页?
如何在云主机上快速搭建网站?
如何注册花生壳免费域名并搭建个人网站?
如何在IIS7中新建站点?详细步骤解析
公司门户网站制作流程,华为官网怎么做?
怀化网站制作公司,怀化新生儿上户网上办理流程?
定制建站价位费用解析与套餐推荐全攻略
如何快速登录WAP自助建站平台?
C#如何使用XPathNavigator高效查询XML
常州企业建站如何选择最佳模板?
如何用西部建站助手快速创建专业网站?
如何快速搭建自助建站会员专属系统?
企业宣传片制作网站有哪些,传媒公司怎么找企业宣传片项目?
*请认真填写需求信息,我们会在24小时内与您取得联系。