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+临键锁解决幻读;隔离级别越高一致性越好,并发性能越低。

相关推荐
努力努力再努力wz16 小时前
【C++ 高阶系列】C++ 高性能网络编程:当 Reactor 遇见协程:从 epoll 回调到异步 MySQL,彻底打通任务挂起与恢复
网络·c++·mysql
这个DBA有点耶16 小时前
测试全绿,上线三周数据没入账——那个95%的兼容度报告,漏掉的是边界
数据库·mysql·架构
1024奇点17 小时前
【仓颉语言入门 · 第二篇 第 15 课】
开发语言·数据库·ide·开源
疯狂学习GIS17 小时前
将谷歌地球引擎账号升级为Contributor与Partner层级的方法
java·数据库·人工智能
gf132111117 小时前
python_高德地图驾车时长查询
数据库·python·mysql
时间售卖铺17 小时前
MySQL 日志管理
运维·数据库·mysql·云原生
秋风点枝17 小时前
数据库 01 · 体系结构与存储引擎
数据库·mysql
CodeGL18 小时前
15、Python 访问数据库
数据库·python
小此方18 小时前
Re:Mysql数据库基础篇(五):拒绝脏数据!一文吃透MySQL表的约束(主键、唯一键、外键与实战案例)
数据库·mysql
想做小南娘,发现自己是女生喵18 小时前
LAN Device Monitor 第二周学习文档
java·服务器·数据库