mysql可重复读防幻读吗_MySQL的可重复读级别能解决幻读吗

mvcc解决了快照读的幻读,间隙锁解决了当前读的幻读

幻读定义:在一个事务里面两次不同时间的相同查询返回了不同的的结果集,这里的不同主要是指结果集的数量不同,而不是内容不同。

mysql的innodb引擎是通过 "行排他锁+MVCC" 一起实现的, 不仅可以保证可重复读, 还可以部分防止幻读, 而非完全防止;

为啥说并没有完全杜绝呢?下面的情况就是mysql通过next-key锁机制杜绝了一些幻读。

操作流程:(1)T1在查询users

(2)T1更新表中的一列数据,这时候会加next-key锁。

(3)T2事务进行插入操作,由于T1加了next-key锁,所以这里T2插入会阻塞,直到T1提交。

(4)T1在查询数据,所有的users表中那一列的数据都更新了。

如果没有next-key锁机制,T2事务的插入操作不会被阻塞,这时候T1在读的时候就会出现有一行数据没有更新的情况出现。这时候就会出现网上很多博客说的情况。明明更新了所有数据,

但是在查询的时候,还 会出现没有更新的数据,貌似出现了幻觉一样。

但是上面的操作mysql通过next-key锁机制预防了那种情况的发送,所以解决此部分的幻读。

即使有了next-key锁,但是还有一部分幻读怎么没有解决呢?

操作流程:(1)T1在查询users,有五行数据

(2)T2插入中的一行数据,并且提交,目前有六行数据。

(3)T1事务进行更新一列的操作,会影响六行数据。

(4)T1在查询数据,所有的users表中那一列的数据都更新了,但是查询出来了六行数据。

这时候,出现了一次事务两次查询,结果集数量不同,这算是一个种特殊幻读。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值