MVCC——可重复度(RR)

  • Post author:
  • Post category:其他


可重复度(RR):仅在第一次执行快照时生成ReadView,后续快照复用。(例外:当本次事务两次快照读之间有当前读,那么第二次快照读会重新生成ReadView)

在这里插入图片描述

对应的undo log版本链为:

在这里插入图片描述

我们来分析一下事务D两次快照读的ReadView:


第一次ReadView



在这里插入图片描述

根据版本链数据访问规则,第一条数据(trx_id = 3)不满足规则;

第二条数据(trx_id = 2)不满足规则;

第三条数据(trx_id = 1)满足 trx_id(1) < min_trx_id(2),说明数据已经提交,可以访问,所以本次查询结果为==“张三”==。


第二次查询复用上次的ReadView


在这里插入图片描述

根据版本链数据访问规则,第一条数据(trx_id = 3)不满足规则;

第二条数据(trx_id = 2)不满足规则;

第三条数据(trx_id = 1)满足 trx_id(1) < min_trx_id(2),说明数据已经提交,可以访问,所以本次查询结果为==“张三”==。

总结:RR隔离级别的实现关键点在于后面的快照读会复用之前的ReadView,所以别的事务虽然修改并提交了,但是后面的快照读ReadView中的m_ids中还保留者它的id,并不会消除,导致无法访问。

由此我们也可解决幻读问题。



特例:产生幻读情况

当两次快照读之间存在当前读时,ReadView会重新生成,产生幻读。



版权声明:本文为huangkechen原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。