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

 

posted @ 2020-05-16 18:40  咆哮的攻城狮  阅读(80)  评论(0)    收藏  举报