如何正确使用 MySQLi 事务实现插入失败自动回滚

发布时间 - 2025-12-25 00:00:00    点击率:

当多个 insert 操作需满足“全成功或全失败”时,必须结合 try/catch 捕获异常,并在出错时显式调用 rollback();仅调用 begin_transaction() 和 commit() 无法自动回滚失败语句。

MySQLi 的事务机制本身不会自动感知 SQL 语法错误或约束冲突——mysqli_query() 遇到非法语句(如 IINSERT)时默认返回 false,但不会抛出异常,除非你启用异常模式。因此,原代码中即使第二条 SQL 因拼写错误执行失败,commit() 仍会被无条件调用,导致第一条合法插入被永久提交,违背原子性要求。

✅ 正确做法是:启用 MySQLi 异常模式 + try/catch + 显式 rollback。需在连接后设置 mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT),使所有错误触发 mysqli_sql_exception:

begin_transaction();

    // 这条会成功
    mysqli_query($connection, "INSERT INTO categories (name) VALUES ('Electronics')");

    // 这条因表名/语法错误触发异常(如 IINSERT → INSERT 拼错)
    mysqli_query($connection, "IINSERT INTO categories (name) VALUES ('Books')");

    // 仅当全部成功才提交
    $connection->commit();
    echo "✅ 所有插入成功完成。";
} catch (mysqli_sql_exception $e) {
    // 任一语句失败即回滚整个事务
    $connection->rollback();
    echo "❌ 事务已回滚。错误:" . $e->getMessage();
}
?>

⚠️ 注意事项:

  • 必须调用 mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT),否则 mysqli_query() 失败仅返回 false,不会进入 catch 块;
  • rollback() 必须在 catch 中显式调用,PHP 不会自动回滚;
  • 事务仅对支持事务的存储引擎(如 InnoDB)生效,MyISAM 不支持;
  • 避免在事务中执行非数据库操作(如文件写入、HTTP 请求),因其无法回滚。

? 总结:事务的原子性不是自动保障的,而是依赖开发者主动检查执行结果并协调 commit()/rollback()。启用严格异常模式 + 结构化异常处理,是确保数据一致性的关键实践。


# mysql  # php  # go  # sql  # try  # catch  # mysqli  # 数据库  # http  # 这条  # 多个  # 并在  # 不支持  # 第一条  # 第二条  # 因其  # 抛出  # 仍会  # 结构化 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 网站制作大概多少钱一个,做一个平台网站大概多少钱?  Android利用动画实现背景逐渐变暗  邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?  Python函数文档自动校验_规范解析【教程】  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?  使用spring连接及操作mongodb3.0实例  如何用AI帮你把自己的生活经历写成一个有趣的故事?  详解vue.js组件化开发实践  Laravel怎么集成Vue.js_Laravel Mix配置Vue开发环境  Laravel怎么解决跨域问题_Laravel配置CORS跨域访问  小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像  Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控  谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程  如何快速搭建自助建站会员专属系统?  如何用花生壳三步快速搭建专属网站?  Laravel如何处理文件上传_Laravel Storage门面实现文件存储与管理  JavaScript如何实现错误处理_try...catch如何捕获异常?  潮流网站制作头像软件下载,适合母子的网名有哪些?  香港服务器租用每月最低只需15元?  Win11怎么修改DNS服务器 Win11设置DNS加速网络【指南】  Win11怎样安装网易有道词典_Win11安装词典教程【步骤】  常州企业网站制作公司,全国继续教育网怎么登录?  车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?  如何撰写建站申请书?关键要点有哪些?  php增删改查怎么学_零基础入门php数据库操作必知基础【教程】  Laravel模型事件有哪些_Laravel Model Event生命周期详解  如何在阿里云通过域名搭建网站?  Laravel Octane如何提升性能_使用Laravel Octane加速你的应用  焦点电影公司作品,电影焦点结局是什么?  PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)  Laravel怎么实现模型属性转换Casting_Laravel自动将JSON字段转为数组【技巧】  如何在橙子建站上传落地页?操作指南详解  Laravel如何使用Service Container和依赖注入?(代码示例)  js实现获取鼠标当前的位置  晋江文学城电脑版官网 晋江文学城网页版直接进入  ,南京靠谱的征婚网站?  打造顶配客厅影院,这份100寸电视推荐名单请查收  黑客如何通过漏洞一步步攻陷网站服务器?  西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?  Laravel怎么判断请求类型_Laravel Request isMethod用法  Laravel怎么使用Blade模板引擎_Laravel模板继承与Component组件复用【手册】  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  如何在腾讯云免费申请建站?  音乐网站服务器如何优化API响应速度?  什么是javascript作用域_全局和局部作用域有什么区别?  Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】  如何快速搭建高效简练网站?  Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南  Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤  谷歌浏览器下载文件时中断怎么办 Google Chrome下载管理修复