事务未生效需先确认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
# 线程
# 数据库
# 报错
# 不支持
# 两次
# 死锁
# 不设
# 是因为
# 也会
# 都要
# 走到
# 长时间
相关文章:
专业网站设计制作公司,如何制作一个企业网站,建设网站的基本步骤有哪些?
网站建设制作需要多少钱费用,自己做一个网站要多少钱,模板一般多少钱?
小型网站制作HTML,*游戏网站怎么搭建?
如何在宝塔面板中修改默认建站目录?
如何在局域网内绑定自建网站域名?
如何选择可靠的免备案建站服务器?
建站之星CMS五站合一模板配置与SEO优化指南
网站按钮制作软件,如何实现网页中按钮的自动点击?
专业公司网站制作公司,用什么语言做企业网站比较好?
如何彻底删除建站之星生成的Banner?
如何选择适合PHP云建站的开源框架?
北京营销型网站制作公司,可以用python做一个营销推广网站吗?
C++ static_cast和dynamic_cast区别_C++静态转换与动态类型安全转换
如何通过VPS建站无需域名直接访问?
如何用已有域名快速搭建网站?
XML的“混合内容”是什么 怎么用DTD或XSD定义
装修招标网站设计制作流程,装修招标流程?
css网站制作参考文献有哪些,易聊怎么注册?
如何在Golang中使用encoding/gob序列化对象_存储和传输数据
高防网站服务器:DDoS防御与BGP线路的AI智能防护方案
如何高效生成建站之星成品网站源码?
如何在腾讯云服务器上快速搭建个人网站?
如何快速搭建高效简练网站?
如何构建满足综合性能需求的优质建站方案?
如何获取PHP WAP自助建站系统源码?
太平洋网站制作公司,网络用语太平洋是什么意思?
大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?
如何通过可视化优化提升建站效果?
如何确保西部建站助手FTP传输的安全性?
,网页ppt怎么弄成自己的ppt?
测试制作网站有哪些,测试性取向的权威测试或者网站?
大连网站设计制作招聘信息,大连投诉网站有哪些?
巅云智能建站系统:可视化拖拽+多端适配+免费模板一键生成
建站之星如何快速生成多端适配网站?
建站之星体验版:智能建站系统+响应式设计,多端适配快速建站
兔展官网 在线制作,怎样制作微信请帖?
制作网页的网站有哪些,电脑上怎么做网页?
制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?
如何在IIS7中新建站点?详细步骤解析
西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?
开心动漫网站制作软件下载,十分开心动画为何停播?
如何选择高效可靠的多用户建站源码资源?
小捣蛋自助建站系统:数据分析与安全设置双核驱动网站优化
如何快速搭建二级域名独立网站?
网站制作服务平台,有什么网站可以发布本地服务信息?
如何在IIS管理器中快速创建并配置网站?
网站制作大概多少钱一个,做一个平台网站大概多少钱?
详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)
胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?
专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?
*请认真填写需求信息,我们会在24小时内与您取得联系。