mysql read next_关于mysql的事务隔离模式、MVCC、next-key,这一篇就够了

本文详细介绍了数据库的四种事务隔离级别(读未提交、读已提交、可重复读、串行化)及其可能导致的问题,如脏读、不可重复读和幻读。重点讲解了InnoDB存储引擎下,MVCC(多版本并发控制)和Next-Key锁如何解决这些问题。在MVCC中,通过版本号避免幻读,而在Next-Key锁下,通过锁定记录间隙和行本身来防止并发问题。文章还给出了具体的查询示例,帮助读者深入理解这些概念。
摘要由CSDN通过智能技术生成

声明

由于贴mysql截图会占太大篇幅,影响整体阅读理解,所以没有贴mysql截图,但是下面步骤都是亲自试验过的

四种隔离级别(由低到高)

Read Uncommitted读未提交:可以看到其他事务未提交的内容

Read Committed读已提交:可以看到其他事务已提交读内容

Repeatable Read可重复读:事务开始时和事务结束时读到的数据完全相同

Serializable串行:事务必须逐步执行,后来的会排队

隔离级别下的问题

前提条件:同时开启A和B两个事务

脏读:

事务查询id为1的数据,num字段为1

B事务将id为1的数据num更新为2,但未commit

事务查询id为1的数据,num字段变为2

B回滚,则A读到的数据为脏数据

不可重复读:

事务查询id为1的数据,num字段为1

B事务将id为1的数据num更新为2,commit

事务查询id为1的数据,num字段变为2

A事务前后两次读到的同一条记录num字段不同,不可重复读

幻读:

A事务查询id >=1 and id <=3的数据,得到id=1和id=3两条数据(注意:没有id=2的数据)

B事务插入id=2的数据

A事务再查询id >=1 and id <=3的数据,发现多了一条id=2的数据,即两次查询数据的行数不同

各种隔离模式下会出现的问题

读未提交:脏读、不可重复度、幻读

读已提交:不可重复读、幻读

可重复读:幻读

间隙锁(gap-key)

在一个事务中select for update查询某条记录,会锁定该条记录的前后空行,什么叫空行呢,看个例子就知道了

idnum

12

24

36

47

执行select * from table where num = 4 for update

insert into table ('', 3)和insert into table ('', 5)都会被阻塞,即4前后的空行都无法插入

next-key

由于gap-key只能锁定记录之间的间隙,但是我们上面查询num=4的行也不能被更改,索引该行也会被加行锁,此时这种既加行速锁,又加间隙锁,我们称之为next-key

MVCC

事务A:查询num>=2 and num<=4的记录,但是不加for update!不加for update!不加for update!

事务B:insert into table ('', 3),不会被阻塞,不会被阻塞,不会被阻塞!然后commit

事务A:查询num>=2 and num<=4的记录,和之前查询相同

事务A:提交

事务A:查询num>=2 and num<=4的记录,可以查询到num=3的记录,此时返回3条结果

原理:假如事务A在开启的时候版本号为2,当更改或者插入数据后,该条记录的版本号+1,也就是说事务B插入num=3的记录的版本号为3,事务A在提交前的所有select都只能查询到版本号<=2的记录,也就是说不会产生上面说的幻读。

MVCC和next-key

看到这里可能有小伙伴有点蒙了,一会MVCC一会next-key,到底用什么结局幻读的???

其实,innodb采用next-key + MVCC去解决幻读问题的:

在查询加for update时,会用next-key解决幻读问题,新的insert和update会阻塞

在查询不加for update时,会用MVCC解决幻读问题,新的insert和update不会阻塞

————————————————

版权声明:本文为CSDN博主「AbleYu」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/why444216978/article/details/105027900/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值