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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)