news 2026/2/27 19:02:56

MySQL 事务:原理、操作与隔离级别深度解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MySQL 事务:原理、操作与隔离级别深度解析

MySQL 事务:原理、操作与隔离级别深度解析

  • 1. 事务概述
  • 2. 事务的提交与回滚操作
  • 3. 事务的隔离级别
  • 4. 事务隔离级别的配置与验证

1. 事务概述

事务是处理复杂数据操作的核心机制,尤其适用于操作量大、逻辑关联性强的场景。例如在企业级人员管理系统中,删除一名员工的操作并非仅删除其基础信息即可,还需同步清理该员工关联的邮箱记录、发布的文章、参与的项目等数据。这些相互关联的数据库操作语句,必须作为一个整体执行,要么全部完成,要么全部回退,而事务正是保障这一执行逻辑的关键。

PS:仅 InnoDB 存储引擎的数据库或数据表支持事务,MyISAM 等其他引擎则无此特性

事务的核心价值体现在四大特性(ACID)上:

  • 原子性(Atomicity):事务是不可分割的最小执行单元,其内部所有操作要么全部成功执行并持久化,要么在任意环节出错时,整个事务回滚至执行前的状态,如同从未执行过
  • 一致性(Consistency):事务执行前后,数据库的完整性约束(如主键唯一、外键关联、字段校验规则等)始终保持有效。例如电商订单创建时,订单金额需等于商品总价 + 运费,事务执行后该等式必须成立,且库存扣减与订单数量需匹配,确保数据逻辑无矛盾
  • 隔离性(Isolation):数据库允许多个事务并发执行,隔离性可防止事务间的相互干扰,避免因交叉执行导致的数据不一致。不同隔离级别下,事务间的隔离程度不同,直接影响并发操作的安全性与性能
  • 持久性(Durability):事务一旦提交,对数据的修改将永久保存至数据库,即便后续发生服务器宕机、系统崩溃等故障,已提交的数据也不会丢失

2. 事务的提交与回滚操作

MySQL 默认开启自动提交:每执行一条INSERT、UPDATE、DELETE语句,系统会自动隐式提交事务,这意味着单条 DML 语句本身就是一个独立事务。但在复杂业务场景中,我们需要手动控制事务的边界,此时需显式开启事务,关闭自动提交。

1、开启事务

使用BEGIN或START TRANSACTION语句显式开启事务,此时后续的 DML 语句将进入同一事务上下文,直至执行COMMIT或ROLLBACK才结束事务

mysql>BEGIN;-- 等价于 START TRANSACTION,开启事务Query OK,0rowsaffected(0.00sec)

2、提交事务

COMMIT(或COMMIT WORK)用于提交事务,将事务内所有 DML 操作的结果永久写入数据库,同时恢复自动提交模式。

mysql>COMMIT;-- 提交事务,所有修改生效Query OK,0rowsaffected(0.01sec)

3、回滚事务

ROLLBACK用于撤销当前事务内未提交的所有修改,将数据还原至事务开启前的状态。回滚仅对未提交的事务有效,若事务已提交,无法通过ROLLBACK撤销。

一个完整的事务回滚案例:

-- 开启事务,关闭自动提交mysql>STARTTRANSACTION;Query OK,0rowsaffected(0.03sec)-- 执行多条插入操作mysql>INSERTINTOdeptVALUES(60,"DAHE","ZHIQUAN");Query OK,1rowaffected(0.00sec)mysql>INSERTINTOdeptVALUES(70,"DAHE","ZHIQUAN");Query OK,1rowaffected(0.00sec)mysql>INSERTINTOdeptVALUES(80,"DAHE","ZHIQUAN");Query OK,1rowaffected(0.00sec)-- 查看事务内的临时数据(此时数据未提交,仅当前会话可见)mysql>SELECT*FROMdept;+--------+------------+----------+|DEPTNO|DNAME|LOC|+--------+------------+----------+|10|ACCOUNTING|NEW YORK||20|RESEARCH|DALLAS||30|SALES|CHICAGO||40|OPERATIONS|BOSTON||60|DAHE|ZHIQUAN||70|DAHE|ZHIQUAN||80|DAHE|ZHIQUAN|+--------+------------+----------+7rowsinset(0.00sec)-- 回滚事务,撤销所有未提交的插入操作mysql>ROLLBACK;Query OK,0rowsaffected(0.05sec)-- 再次查询,数据还原至事务开启前的状态mysql>SELECT*FROMdept;+--------+------------+----------+|DEPTNO|DNAME|LOC|+--------+------------+----------+|10|ACCOUNTING|NEW YORK||20|RESEARCH|DALLAS||30|SALES|CHICAGO||40|OPERATIONS|BOSTON|+--------+------------+----------+4rowsinset(0.00sec)

3. 事务的隔离级别

MySQL 提供四个从低到高的隔离级别,不同级别对应不同的并发问题解决能力,同时也影响数据库的并发性能(级别越高,并发性能越低)

在讲解具体级别前,需先明确三个典型的并发数据问题:

  • 脏读:读取到其他事务未提交的临时数据,该数据可能被回滚,最终无效。
  • 不可重复读:同一事务内多次读取同一数据,结果不一致(因其他事务修改并提交了该数据)。
  • 幻读:同一事务内多次执行相同的查询(如全表扫描),结果集行数不一致(因其他事务插入 / 删除并提交了数据)。

1、读未提交(Read Uncommitted)—— 最低级别

  • 规则:事务 A 可读取事务 B 未提交的任何修改数据。
  • 解决问题:无(仅保证事务原子性)。
  • 存在问题:脏读、不可重复读、幻读均会发生。
  • 实战案例:
    财务人员给员工发工资,误将月薪 3.6 万改为 3.9 万,数据已写入数据库但事务未提交。此时员工查询工资,看到 3.9 万的金额(脏数据),误以为涨薪;随后财务发现错误,回滚事务,将金额改回 3.6 万并提交,员工最终实际工资仍为 3.6 万,此前读取的 3.9 万即为脏读。
  • 适用场景:仅适用于对数据一致性要求极低、追求极致并发性能的场景

2、读已提交(Read Committed)

  • 规则:事务 A 仅能读取事务 B 已提交的修改数据,未提交的数据不可见。
  • 解决问题:解决脏读。
  • 存在问题:不可重复读、幻读仍会发生。
  • 实战案例:
    程序员持信用卡消费,扣款系统开启事务后,第一次查询卡内余额为 3.6 万;此时程序员妻子开启另一事务,将卡内全部金额转出并提交。扣款系统准备扣款时,再次查询余额,发现金额为 0(因妻子的事务已提交)。同一事务内两次查询同一余额结果不同,即不可重复读。
  • 特点:这是 Oracle、SQL Server 等数据库的默认隔离级别,兼顾一定的一致性与并发性能,适用于大多数普通业务场景

3、可重复读(Repeatable Read)—— MySQL 默认级别

  • 规则:事务开启后,多次读取同一数据的结果始终一致,即便其他事务修改并提交了该数据。
  • 解决问题:解决脏读、不可重复读。
  • 存在问题:幻读仍可能发生(注:MySQL InnoDB 引擎通过间隙锁机制,在可重复读级别下已基本解决幻读问题,这是 MySQL 的优化特性)。
  • 实战案例:
    程序员消费时,扣款系统开启事务后查询卡内余额为 3.6 万;此时妻子尝试转出金额,但因可重复读级别限制,修改操作需等待扣款事务结束,扣款系统第二次查询余额仍为 3.6 万,确保扣款操作正常执行,避免不可重复读。
    幻读案例补充:程序员妻子查询其当日消费记录(事务开启),第一次查询显示消费 2000 元;随后程序员新增一笔 1 万元的消费并提交事务,妻子再次执行相同查询,结果显示消费 1.2 万元,即幻读
  • 特点:兼顾一致性与并发性能,是 MySQL 的默认级别,满足绝大多数业务的并发需求。

4、串行化(Serializable)—— 最高级别

  • 规则:所有事务串行化执行,即事务排队依次执行,完全禁止并发操作。
  • 解决问题:解决脏读、不可重复读、幻读所有并发问题。
  • 存在问题:并发性能极低,数据库吞吐量大幅下降。
  • 实战案例:
    多用户同时操作同一订单表时,所有事务需排队执行:事务 A 执行插入操作时,事务 B 的查询、修改操作需等待事务 A 提交;事务 B 执行时,事务 C 需等待,以此类推。
  • 适用场景:仅适用于对数据一致性要求极高、几乎无并发操作的场景(如金融核心交易的对账环节)。

4. 事务隔离级别的配置与验证

1、查看当前隔离级别

MySQL 提供系统变量transaction_isolation(5.7 及以上版本,旧版本为tx_isolation)用于查看隔离级别,支持会话级和全局级查询:

-- 查看当前会话的隔离级别mysql>SELECT@@transaction_isolation;+-------------------------+|@@transaction_isolation|+-------------------------+|REPEATABLE-READ|+-------------------------+1rowinset(0.00sec)-- 查看全局隔离级别mysql>SELECT@@global.transaction_isolation;+--------------------------------+|@@global.transaction_isolation|+--------------------------------+|REPEATABLE-READ|+--------------------------------+1rowinset(0.00sec)

2、修改隔离级别

MySQL 支持会话级和全局级修改隔离级别,修改规则如下:

  • 会话级修改:仅对当前数据库连接生效,关闭连接后失效,不影响其他会话。
  • 全局级修改:对所有新创建的会话生效,已存在的会话不受影响,重启数据库后恢复为配置文件默认值(需修改 my.cnf/my.ini 永久生效)。
-- 将当前会话隔离级别设置为读已提交mysql>SETSESSIONTRANSACTIONISOLATIONLEVELREADCOMMITTED;Query OK,0rowsaffected(0.00sec)-- 验证修改结果mysql>SELECT@@transaction_isolation;+-------------------------+|@@transaction_isolation|+-------------------------+|READ-COMMITTED|+-------------------------+1rowinset(0.00sec)
-- 将全局隔离级别设置为读已提交mysql>SETGLOBALTRANSACTIONISOLATIONLEVELREADCOMMITTED;Query OK,0rowsaffected(0.00sec)-- 当前会话仍保留原级别(可重复读)mysql>SELECT@@transaction_isolation;+-------------------------+|@@transaction_isolation|+-------------------------+|REPEATABLE-READ|+-------------------------+1rowinset(0.00sec)-- 新建一个数据库会话,验证全局级别生效mysql>SELECT@@transaction_isolation;+-------------------------+|@@transaction_isolation|+-------------------------+|READ-COMMITTED|+-------------------------+1rowinset(0.00sec)

3、永久修改隔离级别

若需重启数据库后仍保持隔离级别,需修改 MySQL 配置文件(my.cnf 或 my.ini):

# 新增以下配置,设置全局默认隔离级别为可重复读transaction-isolation=REPEATABLE-READ
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/12 5:09:39

降AI不伤专业术语?2026年实测这2款工具做到了

降AI不伤专业术语?2026年实测这2款工具做到了 很多同学担心:用降AI工具处理后,专业术语会不会被改乱? 我测试了几款工具,结论是:选对工具,专业术语基本不会变。 为什么专业术语容易被改乱&…

作者头像 李华
网站建设 2026/2/27 12:32:42

金手指PCB结构原理与失效机理深度解析

在终端产品返修与失效分析案例中,金手指 PCB 的故障占比常年居高不下,很多用户只关注插拔与清洁,却忽略其结构本质与失效根源。​金手指 PCB 是各类接口类电路板的核心形态,广泛应用于内存条、显卡、PCIe 扩展卡、工业控制板、车载…

作者头像 李华
网站建设 2026/2/27 1:02:28

YOLO26优化:最新注意力机制 | 低计算复杂度的 多尺度线性注意力机制(MSLA)

💡💡💡问题点:基于CNN的方法由于卷积操作的固有局限性,难以有效捕捉全局上下文信息;而基于Transformer的方法则存在局部特征建模不足的问题,同时面临自注意力机制带来的高计算复杂度挑战。 💡💡💡引入多尺度线性注意力机制,旨在以低计算复杂度高效提取图像中的…

作者头像 李华
网站建设 2026/2/25 1:16:08

手动降AI还是用工具?2026年效果对比告诉你答案

手动降AI还是用工具?2026年效果对比告诉你答案 降AI到底要不要花钱?自己手动改行不行? 这是很多同学纠结的问题。这篇文章做个对比,帮你做决定。 手动降AI 做法:一段一段手动改写,打破AI的句式规律。 效…

作者头像 李华
网站建设 2026/2/14 11:41:17

本科论文AI率多少算合格?2026年各高校标准汇总

本科论文AI率多少算合格?2026年各高校标准汇总 本科论文AI率多少算合格? 这是2026届毕业生最关心的问题之一。这篇文章帮你搞清楚各高校的标准,以及怎么达标。 2026年本科论文AI率标准 根据我收集到的信息,大多数高校的标准如…

作者头像 李华