首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >mysql--innodb之隔离级别+脏读+幻读

mysql--innodb之隔离级别+脏读+幻读

原创
作者头像
@锐
修改于 2026-11-05 14:41:11
修改于 2026-11-05 14:41:11
450
举报
文章被收录于专栏:mysqlmysql
  • 隔离级别
    • READ UNCOMMITTED (未提交读) :一个事务开始之后可以看到其他事务未提交的数据,读到未提交的数据也被称作脏读
    • READ COMMITTED(提交读):一个事务开始之后可以看到其他事务提交的数据,但在这个事务提交之前,对其他事务不可见
    • REPEATABLE READ(可重复读):可重复度保证了一个事务内读取的同一行的数据始终是一致的,这里有一个前提是必须是快照读(MVCC), 如果使用锁定读,则极有可能出现幻读
    • SERIALIZABLE(可串行化):最高隔离级别,严格按照事务顺序执行,避免了不同事务之间的冲突,也避免了脏读和幻读等问题,但性能下降严重
  • 读取问题
    • 脏读
      • 读取其他事务未提交的数据
      • 例子:

事务A

事务B

update name="test" from a where id = 1

select name from a where id = 1 输出name=test

commit

  • 幻读
    • 幻读是指在同一范围内的数据时, 数据有删除或者新增
    • 例子: 事务B比事务A创建的更晚

事务A

事务B

select * from a where age > 4 and age <=8 , 输出行age=5 age=6 age=7各一行,总共3行

insert into a(age) values(8);commit

select * from a where age > 4 and age <=8 , 输出行age=5 age=6 age=7 age=8各一行,总共4行,for update 锁定读,锁定读会读取当前已提交的最新数据,此时也就产生了幻读

事务A

事务B

select * from a where age > 4 and age <=8 , 输出行age=5 age=6 age=7各一行,总共3行

insert into a(age) values(8);commit

select * from a where age > 4 and age <=8 , 输出行age=5 age=6 age=7各一行,总共3行, 跟之前比没有变化,这是采用了快照读,也是就是mvcc的版本管理

参考 高性能mysql (第4版)

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档