mvcc
https://blog.csdn.net/w2064004678/article/details/83012387
mysql中mvcc机制下RR级别不能解决幻读
mysql使用MVCC(Multi-Version Concurrency Control,多版本并发控制)机制,默认隔离级别是RR。上面的实验已经回答了一个问题,mysql使用mvcc的RR级别,并不能解决幻读的问题。mvcc默认使用数据的创建时间和删除时间版本来管理数据,读的数据为快照,但操作是会在最新版本的数据上进行。存在以下几种情况:
- sessionA读,sessionB更新,sessionA读,无幻读 (默认使用A的版本快照)
- SessionA读,session更新,sessionA更新,sessionA的预期结果与实际得到的结果不一致。(A更新时使用最新数据,更新完以后将版本修改为当前版本)
- 如果其他session删除数据,当前session更新时找不到数据,但读取仍然能读取到。(当前session版本快照还未被删除)
即:读取快照;操作使用最新version,若操作成功,创建version变为当前系统version(包含其他session在当前session后启动,且更新过数据的部分),再次读取为更新后的数据,若操作失败,再次读取仍然是快照的version。
即使有了next-key锁,但是还有一部分幻读怎么没有解决呢?
操作流程:(1)T1在查询users,有五行数据
(2)T2插入中的一行数据,并且提交,目前有六行数据。
(3)T1事务进行更新一列的操作,会影响六行数据。
(4)T1在查询数据,所有的users表中那一列的数据都更新了,但是查询出来了六行数据。
这时候,出现了一次事务两次查询,结果集数量不同,这算是一个种特殊幻读。
https://segmentfault.com/a/1190000012650596

浙公网安备 33010602011771号