MySQL 中的事务隔离级别有哪些?

MySQL 中的事务隔离级别有哪些?

SQL标准定义4种事务隔离级别,InnoDB全部支持,MySQL默认是可重复读 RR

隔离级别由低到高:读未提交 → 读已提交 → 可重复读 → 串行化

三种并发问题(脏读、不可重复读、幻读)

  1. 脏读 :一个事务读到另一个事务未提交的数据,如果对方回滚,读到的数据就是脏数据。
  2. 不可重复读 :同一个事务内,同一条SQL多次执行,读到的数据不一样 。别的事务提交修改,本事务读到新数据。重点是:数据内容发生变化
  3. 幻读 :同一个事务,同样的查询,前后返回的行数不一样。别的事务插入/删除数据,本事务出现凭空多出或者少行,重点是行数变化

四个隔离级别

1. Read Uncommitted 读未提交

  • 可以读取其他事务还没有提交的数据
  • 会出现:脏读、不可重复读、幻读
  • 几乎不会线上使用

2. Read Committed(RC)读已提交

  • 只能读到其他事务已经提交的数据
  • 解决:脏读
  • 存在:不可重复读、幻读
  • MVCC行为:每次select都生成新的ReadView

很多互联网项目会把隔离级别改成RC,锁冲突更少,并发更高。

3. Repeatable Read(RR)可重复读,MySQL InnoDB默认级别

  • 同一个事务内部,多次读取,读到的数据始终是事务启动时的快照
  • 解决:脏读、不可重复读
  • SQL标准中RR还存在幻读,MySQL的InnoDB通过 MVCC + 间隙锁(临键锁)解决了幻读
  • MVCC行为:事务第一次select才生成ReadView,整个事务复用同一个视图

4. Serializable 串行化

  • 最高隔离级别,所有普通select隐式转为select ... share mode,全部加共享锁
  • 全部问题都解决:脏读、不可重复读、幻读
  • 事务串行执行,并发能力极差,几乎不用。
隔离级别 脏读 不可重复读 幻读
读未提交 存在 存在 存在
读已提交RC 不存在 存在 存在
可重复读RR 不存在 不存在 InnoDB已解决
串行化 不存在 不存在 不存在

补充面试高频考点

  1. Oracle默认隔离级别是RC,MySQL InnoDB默认RR。
  2. RC级别没有间隙锁,只有行锁;RR级别才会产生间隙锁、临键锁,用来解决幻读。
  3. 隔离级别越高,并发性能越差;级别越低,并发越高,但数据一致性问题越多。

总结:

一共4种隔离级别:读未提交、读已提交RC、可重复读RR、串行化;MySQL默认RR;RC每次查询生成ReadView,RR事务首次查询生成ReadView;InnoDB在RR下依靠MVCC+临键锁解决幻读;隔离级别越高一致性越好,并发性能越低。

相关推荐
勤奋的树懒5 小时前
从手写 SQL 到 Windows 工具:致远 OA 文件清理实践
数据库·sql·windows server·致远oa
笃行3505 小时前
OceanBaseVS金仓:一条 SQL 的两条路——KingbaseES 的性能竞争力从哪来
数据库
其实防守也摸鱼5 小时前
每天一个知识点——RCE漏洞
运维·服务器·数据库·windows·安全·github·漏洞
TDengine (老段)5 小时前
TDengine 常见问题 TOP2
大数据·数据库·物联网·时序数据库·tdengine·涛思数据
笃行3505 小时前
数据迁移工具 KDMS 帮我把一本糊涂账算清了
数据库
笃行3506 小时前
SQLServer数据库迁移实录:十年老系统搬上 KingbaseES,T-SQL 基本没重写
数据库
落魄大学生之流水线上谋生计7 小时前
Java并发核心机制详解:线程池、CAS、AQS、锁升级
java·开发语言·数据库
Wang's Blog7 小时前
Java框架快速入门: Spring Security+OAuth2之邮件验证码发送(SMTP与API方式)
java·数据库·spring
砚底藏山河9 小时前
容错重试与指数退避:网络抖动手抖不再丢数据(魔码量化实战 #04)
java·数据库·python·金融
蓝速科技9 小时前
会议室门牌触控预约选型与落地实战指南丨蓝速科技
大数据·运维·数据库·人工智能·科技