mysql数据库事务的基本概念_mysql事务入门解析

发布时间 - 2026-01-30 00:00:00    点击率:
事务是“要么全成,要么全废”的操作包,本质为InnoDB引擎下需原子执行的一组DML;须关闭autocommit、显式START TRANSACTION、最终COMMIT或ROLLBACK;DDL会隐式提交并破坏事务。

事务就是“要么全成,要么全废”的操作包

MySQL 事务本质是一组逻辑相关的 INSERTUPDATEDELETE 操作,它们必须作为一个整体生效或失效。比如转账:A 减 100 元、B 加 100 元——这两步不能拆开;如果第二步失败,第一步也必须撤回,否则钱就“凭空消失”了。

关键前提是:InnoDB 引擎(MyISAM 不支持事务),且当前会话的 autocommit 必须为 0。MySQL 默认是 autocommit=1,也就是说每条 SQL 都自动提交,根本谈不上“打包控制”。不关掉它,START TRANSACTIONROLLBACK 就形同虚设。

手动控制事务的三步铁律

不是写个 START TRANSACTION 就算进了事务——得闭环执行,漏一步就前功尽弃:

  • SET autocommit = 0(只对当前连接有效,建议每次连接后显式设置)
  • START TRANSACTION(或 BEGIN)——真正开启事务边界
  • 执行完所有 DML 后,必须明确 COMMIT(成功)或 ROLLBACK(出错时撤销)

常见错误:执行完 UPDATE 就断开连接,没 COMMIT,那修改当场丢失;或者误以为 SELECT 也能被回滚(它不能,只是读视图)。

隔离级别不是选“高就好”,而是看并发场景要防什么

MySQL 默认是 REPEATABLE READ,但它并不能完全避免幻读(比如 SELECT COUNT(*) 在事务中两次结果不同)。如果你的应用大量依赖“读一致性”,又频繁插入/删除,就得权衡:

  • READ COMMITTED:避免脏读,但不可重复读仍存在;适合日志类、统计类读多写少场景
  • REPEATABLE READ:InnoDB 用 MVCC + Next-Key Lock 实现,能防不可重复读和大部分幻读,但复杂查询可能锁更多行
  • SERIALIZABLE:强制串行执行,彻底防幻读,但性能暴跌,高并发下极易锁等待超时

别在业务代码里硬编码 SET TRANSACTION ISOLATION LEVEL,而应在连接池配置或应用层统一指定,避免混用导致行为不一致。

DDL 语句是事务里的“核按钮”,一碰就自动提交

哪怕你在 START TRANSACTION 之后执行 CREATE TABLEALTER TABLEDROP INDEX,MySQL 会立刻隐式执行 COMMIT,前面所有未提交的 DML 都会被提前落库——而且无法回滚。

这很容易被忽略,尤其在运维脚本或迁移工具中混写 DDL 和 DML。安全做法是:

  • 把 DDL 单独拎出来,在事

    务外执行
  • SHOW ENGINE INNODB STATUS 查看最近事务是否被意外截断
  • 开发阶段开启 general_log,确认实际执行顺序

事务不是万能保险丝,它只保 DML 的原子性;DDL、LOCK TABLESSET 变量等都属于“事务破坏者”,得提前识别并隔离。


# mysql  # 编码  # 工具  # sql  # count  # select  # delete  # 并发  # table  # 数据库  # 闭环  # 隐式  # 前功尽弃  # 就好  # 你在  # 也能  # 形同虚设  # 两次  # 进了  # 很容易 


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


相关推荐: 如何在云主机上快速搭建多站点网站?  如何快速启动建站代理加盟业务?  如何在景安云服务器上绑定域名并配置虚拟主机?  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  Laravel如何使用软删除(Soft Deletes)功能_Eloquent软删除与数据恢复方法  ,在苏州找工作,上哪个网站比较好?  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  如何快速搭建安全的FTP站点?  Laravel怎么配置.env环境变量_Laravel生产环境敏感数据保护与读取【方法】  EditPlus中的正则表达式实战(6)  如何在云虚拟主机上快速搭建个人网站?  油猴 教程,油猴搜脚本为什么会网页无法显示?  Python3.6正式版新特性预览  手机怎么制作网站教程步骤,手机怎么做自己的网页链接?  Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives  WordPress 子目录安装中正确处理脚本路径的完整指南  如何在橙子建站上传落地页?操作指南详解  Laravel如何创建自定义Facades?(详细步骤)  网站优化排名时,需要考虑哪些问题呢?  大连 网站制作,大连天途有线官网?  javascript中的数组方法有哪些_如何利用数组方法简化数据处理  Laravel如何实现文件上传和存储?(本地与S3配置)  Laravel如何将应用部署到生产服务器_Laravel生产环境部署流程  如何快速生成ASP一键建站模板并优化安全性?  如何在宝塔面板中修改默认建站目录?  如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环  图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  JavaScript如何实现错误处理_try...catch如何捕获异常?  Python数据仓库与ETL构建实战_Airflow调度流程详解  香港服务器网站卡顿?如何解决网络延迟与负载问题?  Laravel Eloquent模型如何创建_Laravel ORM基础之Model创建与使用教程  Laravel如何使用Service Provider注册服务_Laravel服务提供者配置与加载  中山网站推广排名,中山信息港登录入口?  Android使用GridView实现日历的简单功能  如何在企业微信快速生成手机电脑官网?  Win11怎么修改DNS服务器 Win11设置DNS加速网络【指南】  在centOS 7安装mysql 5.7的详细教程  laravel服务容器和依赖注入怎么理解_laravel服务容器与依赖注入解析  laravel怎么为应用开启和关闭维护模式_laravel应用维护模式开启与关闭方法  郑州企业网站制作公司,郑州招聘网站有哪些?  浅谈javascript alert和confirm的美化  香港网站服务器数量如何影响SEO优化效果?  js实现点击每个li节点,都弹出其文本值及修改  成都网站制作公司哪家好,四川省职工服务网是做什么用?  Laravel怎么配置不同环境的数据库_Laravel本地测试与生产环境动态切换【方法】  如何快速查询网址的建站时间与历史轨迹?  html5怎么画眼睛_HT5用Canvas或SVG画眼球瞳孔加JS控制动态【绘制】  利用JavaScript实现拖拽改变元素大小  Laravel怎么在Blade中安全地输出原始HTML内容  制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?