mysql的默认隔离级别是RR,RR的快照读在某些业务场景下可能引发一些问题。
举个例子,user表存在数据如下:
id | name |
1 | abc |
RR隔离级别下,两个会话分别执行如下语句:
Session 1 | Session 2 | |
Time 1 | begin; select name from user where id=1; | |
Time 2 | begin; update user set name=’b’ where id=1; commit; | |
Time 3 | select name from user where id=1; commit; | |
Time 4 | select name from user where id=1; |
Session 1的三次查询结果分别为abc、abc、b
第二次查询的结果并不是最新值,而是第一次查询时创建的快照
如果要在第二次查询时获取最新值,需要将事务级别改为RC,或者在语句后加上for share/for update
参考官方文档:
https://dev.mysql.com/doc/refman/8.0/en/innodb-consistent-read.html