当前位置: 首页 > news >正文

MySQL事务隔离级别

目录

事务

一 事务的四大特性(ACID)

1 原子性(Atomicity) :

2 一致性(Consistent)

3 隔离性(Isolation)

4 持久性(Durability)

二 事务的生命周期

三 并发事务带来的问题

四 事务的隔离级别

MySQL 可重复读的特殊性

五 事务的实现原理

1. Redo Log(重做日志)

2. Undo Log(回滚日志)

3. MVCC(多版本并发控制)

六 事务最佳实践

七 事务选择决策


事务

事务是数据库管理系统执行过程中的一个逻辑工作单元,它由一系列数据库操作组成,这些操作要么全部成功,要么全部失败(不会出现部分成功、部分失败的情况)。

一 事务的四大特性(ACID)

1 原子性(Atomicity) :

定义:事务中的所有操作是一个不可分割的整体,要么全部执行成功,要么全部不执行(回滚)。

实现原理

  • Undo Log(回滚日志):记录数据修改前的旧值

  • 事务失败时,通过 Undo Log 将数据恢复到事务开始前的状态

2 一致性(Consistent)

定义:事务执行前后,数据库从一个一致状态转变为另一个一致状态,完整性约束不被破坏。

注意:一致性是 ACID 的最终目标,原子性、隔离性、持久性都是为了实现一致性。

3 隔离性(Isolation)

定义:多个事务并发执行时,相互隔离,互不干扰。

实现原理

  • 锁机制:共享锁、排他锁

  • MVCC(多版本并发控制):通过数据版本链实现读写不互斥

隔离级别(从低到高):

  • 读未提交:可能脏读

  • 读已提交:避免脏读

  • 可重复读:避免脏读、不可重复读(MySQL默认)

  • 串行化:避免所有并发问题

4 持久性(Durability)

定义:事务一旦提交,对数据的修改就是永久性的,即使系统崩溃也不会丢失。

实现原理

  • Redo Log(重做日志):记录数据修改后的新值

  • 事务提交时,先将 Redo Log 写入磁盘

  • 系统恢复时,通过 Redo Log 重放已提交的事务

两阶段提交

事务执行 → 写入 Redo Log(prepare状态)→ 写入binlog →提交 → Redo Log 变为 commit 状态 → 数据写入磁盘(空闲时)

二 事务的生命周期

-- 1. 开始事务
START TRANSACTION; -- 或 BEGIN;

-- 2. 执行 SQL 操作
INSERT INTO user(name) VALUES('张三');
UPDATE account SET balance = 1000 WHERE id = 1;

-- 3. 提交事务(永久生效)
COMMIT;

-- 或回滚事务(撤销所有操作)
ROLLBACK;

三 并发事务带来的问题

问题描述示例
脏读读到其他事务未提交的数据事务A读到事务B未提交的修改,B回滚,A读到脏数据
不可重复读同一事务内两次读同一数据结果不同,不符合隔离性事务A两次读取余额,中间事务B修改并提交,两次结果不一致
幻读同一事务内两次范围查询结果集行数不同,不符合隔离性事务A两次查询用户列表,中间事务B插入新用户,两次结果条数不同
丢失更新后提交的更新覆盖了先提交的更新两人同时编辑同一数据,后保存者覆盖先保存者的修改

四 事务的隔离级别

隔离级别脏读不可重复读幻读并发性能默认数据库
读未提交❌ 可能❌ 可能❌ 可能最高-
读已提交✅避免❌ 可能❌ 可能Oracle, SQL Server
可重复读✅ 避免✅ 避免⚠️ InnoDB解决MySQL
串行化✅ 避免✅ 避免✅ 避免最低-

MySQL 可重复读的特殊性

MySQL InnoDB 通过以下机制,在可重复读级别解决了幻读:

  1. MVCC(多版本并发控制):事务在第一次读取时生成快照(Read View),后续所有读取都基于这个快照。

  2. 间隙锁(Gap Lock):在范围查询时锁定索引记录之间的间隙,防止幻影行插入。

五 事务的实现原理

1. Redo Log(重做日志)

作用:保证持久性

机制

  • 记录数据修改后的新值

  • 采用 WAL(Write-Ahead Logging)技术:先写日志,后写磁盘

  • 循环写入(固定大小),写满后会触发 checkpoint

2. Undo Log(回滚日志)

作用:保证原子性和 MVCC

机制

  • 记录数据修改前的旧值

  • 用于事务回滚和数据版本管理

  • 形成版本链,支持 MVCC 快照读

3. MVCC(多版本并发控制)

核心思想:读写不互斥,写操作创建新版本,读操作读取旧版本

关键组件

  • 隐藏字段:DB_TRX_ID(事务ID)、DB_ROLL_PTR(回滚指针)

  • Read View(一致性视图):记录当前活跃事务列表

  • Undo Log 版本链:按时间顺序存储的历史版本

读操作分类

  • 快照读:普通SELECT,读取历史版本,无锁

  • 当前读SELECT ... FOR UPDATEUPDATEDELETE,读取最新版本,加锁

六 事务最佳实践

实践说明示例
事务粒度最小化只在必要范围内使用事务将网络请求、文件操作移出事务
只读事务优化纯查询使用readOnly=true@Transactional(readOnly = true)
明确回滚规则指定需要回滚的异常类型@Transactional(rollbackFor = Exception.class)
合理的隔离级别根据业务选择,避免盲目使用串行化默认可重复读即可满足多数场景
处理事务失效注意 self-invocation、public方法等通过代理调用或注入自身
监控长事务避免事务持有时间过长设置超时时间timeout = 30

七 事务选择决策

场景推荐方案隔离级别锁策略
简单增删改默认事务可重复读默认行锁
复杂报表查询只读事务可重复读无锁(快照读)
高并发扣库存乐观锁读已提交版本号机制
热点账户转账悲观锁读已提交SELECT FOR UPDATE
数据一致性要求极高串行化串行化表锁/间隙锁
分布式事务最终一致性读已提交TCC/消息表

事务是保证数据一致性的核心机制,但需要谨慎使用:事务范围太小可能无法保证一致性,太大则会影响性能。在实际开发中,需要在数据一致性和系统性能之间找到平衡点。

http://www.jsqmd.com/news/511855/

相关文章:

  • 杭州正规的税务合规服务公司费用大概多少钱 - 工业品网
  • Matlab Simulink下直驱永磁风电机组并网仿真模型详解:双PWM变流器控制策略及详细...
  • SPSS岭回归实战:从语法调用到结果解读全流程解析
  • 想通过gometa实现通用excel导出工具
  • 类目竞争加剧如何找到细分需求切入点
  • 解读高新企业代理记账机构,推荐几家杭州值得选的 - 工业品牌热点
  • 美胸-年美-造相Z-Turbo入门秘籍:写好描述词,让AI听懂你的想法
  • 中国地形地势分布+地貌矢量数据shp
  • 时域信道估计和时域信道均衡以及matlab代码手搓(注意是时域,后续讲ofdm相关的频域信道估计和均衡)
  • 聊聊2026年金杉木双筋直拼板ENF级板材厂家,哪家性价比高 - myqiye
  • 用Three.js+OrbitControls打造可旋转的3D中国地图:新手避坑指南
  • 百考通:AI赋能实践报告,智能生成优质内容,让实习总结高效又专业
  • 字符编码:从基础到实战的核心解析
  • 基于企微API与CRM对接,构建试听后的自动化跟进与转化SOP
  • 苹果 M5 系列 MacBook 发布,升级与选择的深度剖析
  • 讲讲甘肃万通汽修教育网址和学校地址,学新能源汽车价格如何 - mypinpai
  • 当大事件突然降临,普通人的第一反应往往是懵的
  • 【无人售货柜・RK+YOLO】篇 4:效果拉满!针对无人售货柜场景的 YOLO 模型优化技巧,解决 90% 的识别问题
  • Ant Table隐藏技巧:用reduce+sticky实现财务系统级合计行
  • 基于观测器的LOS制导结合反步法控制:无人船艇路径跟踪控制的Fossen模型在Matlab S...
  • BrowseComp-ZH:中文网络生态下大模型检索能力的极限挑战
  • 思阳GEO思考:3步破解搜索痛点,抢占AI优先推荐
  • Face Analysis WebUI模型安全防护策略
  • 【无人售货柜・RK+YOLO】篇 5:RK3576 部署第一步!YOLO 模型转 RKNN 全流程,新手必避的量化大坑
  • Perplexity+NotebookLM=天才
  • 双碳目标下的能耗监测大屏:企业通用
  • Vue3 + Vxe-Table 实战:手把手教你实现可编辑表格的实时合计与平均(附完整代码)
  • 域名解析与配置
  • C# 字典(Dictionary)入门:从零开始掌握键值对集合
  • Python实战:用NumPy手撕SVD分解(附完整代码与可视化)