全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

php和mysql事务出错怎么查_php数据库事务调试方法【教程】

事务未生效需先确认autocommit是否被关闭:MySQLi/PDO默认开启,但begin_transaction后进入手动模式,必须显式commit/rollback;PDO须设ERRMODE_EXCEPTION防静默失败;MySQL中查INNODB_TRX可诊断卡住事务;MySQL不支持嵌套事务,应改用savepoint或统一事务边界。

事务没生效,先确认 autocommit 是否被意外关闭

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 中 setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION) 必须开启

默认 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 出错会被吞掉
  • 不设这个,外键约束失败、字段超长、NULL 插入 NOT NULL 字段等都静默失败
  • PDOStatement::execute() 抛出的 PDOException 可直接被捕获并触发 rollback()

MySQL 层面检查事务是否卡住或被 kill

当 PHP 脚本崩溃、超时或被 nginx/fastcgi 终止,但 MySQL 连接未断开时,事务可能长期处于 ACTIVE 状态,阻塞其他操作。此时查不到 PHP 报错,但数据库变慢、SELECT ... FOR UPDATE 卡住、甚至出现死锁。

登录 MySQL 执行:

SELECT * FROM information_schema.INNODB_TRX\G

重点关注字段:

  • TRX_STATE = 'RUNNING' 但长时间不动 → 可能是 PHP 没 commit/rollback
  • TRX_MYSQL_THREAD_ID 对应线程 ID,可用 KILL [thread_id] 强制终止
  • TRX_QUERY 显示当前执行语句,可判断卡在哪一步

注意:InnoDB 事务不支持跨连接传播,START TRANSACTION 只对当前连接有效,别指望一个请求里的事务影响另一个请求。

嵌套事务在 MySQL 中实际不生效,PHP 代码里别信 beginTransaction 嵌套

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小时内与您取得联系。