MySQL幻读实验

MySQL幻读实验,第1张

MySQL幻读实验 问题

MySQL隔离级别介绍:
1 back-to-basics-isolation-levels-in-mysql
2 understanding-mysql-transaction-isolation-levels-by-example

MySQL innoDB默认隔离级别是 REPEATABLE READ。
按照第1篇文章的说法,REPEATABLE READ 可重复读,但会带来幻读问题:

然而,我去做一下实验,发现并不是这样的

实验

MySQL版本 8.0.27

 CREATE TABLE `userinfo` (
  `id` int unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(100) NOT NULL,
  `balance` int NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8mb3
验证 REPEATABLE READ

左边为tx1, 右边为tx2

可以看到,并没有发生幻读。
1、t1时刻:tx2读取数据,读到3条数据
2、t2时刻:tx1插入2条数据
3、t3时刻,tx2读取数据,只读到原来的3条,即,实现了“可重复读”

触发幻读

1、tx2重复插入id=4(在tx1中已经插入),没有触发幻读:

2、tx2插入一条id=6的记录(tx1插入的是id=4和id=5),没有幻读

3、tx2更新了tx1的两条记录(id=4、id=5),触发了幻读!


4、只有数据发生了变化,才会重新读,才会触发幻读,而且只会把有变化的数据“幻读”回来:
如下图,tx1插入了2条数据,id=7,id=8
在tx2中更新了id=7,那它就只把id=7幻读回来,id=8则没有,就好像id=8不存在一样:

结论

1、MySQL的mvcc解决了repeatable read的部分幻读问题,但不是全部。
2、当两个“快照读”之间,发生了“当前读”,才会触发幻读现象。
可以参考这个
https://www.bilibili.com/video/BV1hL411479T?spm_id_from=333.999.0.0

其他参考

Innodb中的事务隔离级别和锁的关系

还有这篇
mysql database phantom read

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5719842.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-18
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存