MySQLi执行SQL如何开启事务

小晨酱_2264

小晨酱_2264

2026-08-20

756人浏览

原创

mysqli::autocommit(false) 是开启事务的起点,它关闭自动提交模式,使后续dml语句进入隐式事务上下文,需显式commit或rollback;不依赖begin/start transaction,且要求引擎为innodb。

mysqli执行sql如何开启事务

mysqli::autocommit(false) 是开启事务的起点

直接调用 $mysqli->autocommit(false) 是 PHP 中最常用、也最稳妥的事务开启方式。它会关闭当前连接的自动提交模式,此后所有 DML 语句(INSERTUPDATEDELETE)都进入一个隐式事务上下文,直到你显式调用 commit()rollback()

注意:这不是“启动一个事务块”,而是“让后续所有语句默认属于事务”——和 MySQL 命令行里执行 SET autocommit = 0 效果一致。它不依赖 BEGINSTART TRANSACTION,也不受存储引擎是否支持显式事务语句的影响(只要引擎本身支持事务,比如 InnoDB)。

  • autocommit(false) 必须在执行任何 DML 前调用;如果中间混入了 CREATE TABLE 等 DDL,会触发隐式提交,导致前面的操作提前落库
  • 调用后无需再写 START TRANSACTION;重复调用不会报错,但无意义
  • 若连接断开且未 commit,事务自动回滚——这点常被忽略,尤其在长脚本或 CLI 模式下

为什么不用 mysqli::begin_transaction()?

PHP 7.0+ 提供了 $mysqli->begin_transaction() 方法,看起来更“标准”,但它本质只是封装了 START TRANSACTION 语句,并不改变 autocommit 状态。问题在于:如果当前 autocommit = 1,只调用 begin_transaction() 后执行一条 UPDATE,再 commit(),看似正常;但一旦中间出错没捕获,没 rollback(),下次再执行 DML 就又变成自动提交了——事务边界变得模糊。

相比之下,autocommit(false) 把控制权牢牢握在 PHP 层:事务生命周期完全由你决定,不会因某次忘记 begin_transaction() 而意外失效。

MySQL
MySQL

编写正确的MySQL查询,避免字符集、索引和锁方面的常见陷阱。

下载
  • begin_transaction() 支持传参,如 MYSQLI_TRANS_START_READ_ONLY,适合只读场景,但日常增删改几乎用不到
  • 如果你用的是老版本 PHP(autocommit(false) 是唯一兼容方案
  • 混合使用两者(比如先 autocommit(false)begin_transaction())不会冲突,但没必要

错误处理必须显式判断 mysqli->errno

mysqli 不会因为 SQL 执行失败就自动中断后续语句或触发回滚。哪怕 UPDATE 因主键冲突返回 false,下一行 INSERT 仍会继续执行——最终可能留下脏数据。

正确做法是每条 DML 后检查 $mysqli->errno,为 0 才继续,非 0 就立刻 rollback() 并退出逻辑。

  • 别依赖 if ($mysqli->query($sql)),因为某些错误(如警告、影响行为异常)可能不中断执行但已破坏一致性
  • $mysqli->affected_rows 不能替代 errno 判断:更新 0 行可能是条件不匹配,也可能是语句执行失败,二者含义完全不同
  • 在 try/catch 中捕获异常不够——mysqli 默认不抛异常,需手动设置 mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT),否则 query() 出错仍静默返回 false

InnoDB 表 + autocommit(false) 是硬性前提

事务不是开关,而是能力组合。两个条件缺一不可:

  • 表必须是 InnoDB 引擎(SHOW CREATE TABLE t 查看 ENGINE=InnoDB);MyISAM 表调 autocommit(false) 完全无效,DML 依然立即生效
  • 连接必须使用支持事务的用户权限;极少数受限账号可能被禁止事务操作,表现为 START TRANSACTION 报错,但 autocommit(false) 不报错却不起作用
  • 事务不跨连接:你在 CLI 开启事务修改了数据,Web 请求里查不到,这是隔离性正常表现,不是 bug

最容易被跳过的其实是引擎检查——开发环境建表时随手用 CREATE TABLE 没指定 ENGINE,默认可能是 MyISAM(尤其旧版本 MySQL),上线后事务始终不生效,排查起来非常耗时。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

mysql

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
Vibeknow在线使用入口合集
Vibeknow在线使用入口合集

本专题汇总了Vibeknow在线创作视频的官方入口及网页版使用教程,涵盖PPT、PDF、Word等文档一键转讲解视频的核心操作,并整理了免费版水印规则与手机端浏览器访问指南,助你快速将知识内容视频化。

2026.09.21

0

20

NumPy随机数文件读写与dtype数据类型
NumPy随机数文件读写与dtype数据类型

本专题整理 NumPy 随机数、文件读写与 dtype 数据类型相关教程,覆盖 Generator/random、随机数种子、正态分布采样、npy/npz/CSV/TXT 保存读取、loadtxt/savetxt、memmap、大文件处理、astype 类型转换、结构化 dtype、整数溢出和精度丢失等场景。

2026.09.21

0

24

NumPy矩阵运算与线性代数计算
NumPy矩阵运算与线性代数计算

本专题整理 NumPy 矩阵运算与线性代数计算相关教程,覆盖矩阵乘法、dot 与 @ 运算符、逆矩阵、行列式、特征值与特征向量、SVD、线性方程组、欧氏距离、矩阵分解和大规模矩阵性能优化等内容,帮助读者掌握 np.linalg 与矩阵计算实战。

2026.09.21

0

20

NumPy广播机制数学运算与统计分析
NumPy广播机制数学运算与统计分析

本专题整理 NumPy 广播机制、数组数学运算与统计分析相关教程,覆盖广播规则、维度对齐、矩阵与数组加减除法、向量化计算、均值方差、分位数、中位数、直方图和 unique 频次统计等场景,帮助读者掌握 ndarray 高效计算与统计处理方法。

2026.09.21

0

17

NumPy数组创建索引切片与数据选择
NumPy数组创建索引切片与数据选择

本专题整理 NumPy 数组创建、索引、切片与数据选择相关教程,覆盖 np.array、zeros/ones、多维数组形状、基础切片、花式索引、布尔索引、条件筛选、视图与副本等常用场景,帮助读者系统掌握 ndarray 数据构造与高效提取方法。

2026.09.21

0

12

Aionclaw智能助手介绍
Aionclaw智能助手介绍

本专题汇总了AionClaw(AI龙虾助手)的功能介绍与在线使用入口。AionClaw是杭州趣猿人工智能有限公司推出的桌面级AI智能体,能直接在电脑上读写文件、运行脚本、操作浏览器,自动交付Word、PPT、Excel等成品。

2026.09.20

20

13

AionClaw AI智能体与电脑自动化任务执行功能使用教程
AionClaw AI智能体与电脑自动化任务执行功能使用教程

AionClaw专题整理AI智能体与电脑自动化相关功能使用教程,涵盖安装部署、AI任务执行、Skills技能、文件处理、浏览器控制、电脑操作、持久记忆、聊天工具连接以及办公、编程和内容创作等功能,帮助用户快速掌握AionClaw的实际使用方法。

2026.09.20

0

15

AI视频生成软件推荐
AI视频生成软件推荐

本专题汇总了当前主流的AI视频生成软件推荐与排行榜单,涵盖seko、AniShort、剧云、Lovart、LiblibAI及立刻mv等热门工具。同时整理了各软件在文生视频、图生视频、时长限制、画质表现及免费额度等方面的差异对比,助您快速选对适合创作需求的AI视频生成工具。

2026.09.16

200

9

ai生成视频的工具免费版合集
ai生成视频的工具免费版合集

本专题汇总了当前免费AI生成视频工具的排行榜与推荐清单,涵盖seko、讯飞智作、AniShort及剧云、Lovart等多模型集成平台。同时整理了各工具的免费额度、输出时长、水印政策及适用场景差异,助您快速选择合适工具开启AI视频创作。

2026.09.16

100

10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 169人学习

使用phpenv集成环境安装极致CMS
使用phpenv集成环境安装极致CMS

共2课时 | 271人学习