MVCC——可重复度(RR)

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

MVCC——可重复度(RR)
对应的undo log版本链为:
MVCC——可重复度(RR)
我们来分析一下事务D两次快照读的ReadView:

第一次ReadView
MVCC——可重复度(RR)

根据版本链数据访问规则,第一条数据(trx_id = 3)不满足规则;
第二条数据(trx_id = 2)不满足规则;
第三条数据(trx_id = 1)满足 trx_id(1) < min_trx_id(2),说明数据已经提交,可以访问,所以本次查询结果为==“张三”==。

第二次查询复用上次的ReadView
MVCC——可重复度(RR)
根据版本链数据访问规则,第一条数据(trx_id = 3)不满足规则;
第二条数据(trx_id = 2)不满足规则;
第三条数据(trx_id = 1)满足 trx_id(1) < min_trx_id(2),说明数据已经提交,可以访问,所以本次查询结果为==“张三”==。

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

特例:产生幻读情况

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

上一篇:MySQL之事务设计


下一篇:innodb_trx