MySQL--MVCC
作者:互联网
MVCC 实现原理
总结:
-
并发事务在操作资源的时候,存在着三种操作,分别为: 读读操作、读写操作、写写操作,这三种操作可能带来脏读、不可重复读、幻读的问题。使用锁能够解决这些问题,但是,加锁每次只能有一个事务操作资源,会导致数据库性能不佳。因此就有了MVCC。
-
MVCC指的是多版本并发控制。
-
使用目的: 通过记录多个修改的历史版本替代锁,实现事务间的隔离效果,保证非阻塞读。
-
MVCC的两种读方式:
- 当前读: 总是读取到最新版本的数据;
- 快照读: 读取的是历史版本记录。
-
MVCC的实现核心
-
表的隐藏列: 记录事务id以及上一个版本数据的地址;
-
undo log: 记录数据各版本修改历史,也即为事务链;
-
Read View: 读视图,用于判断那些版本是可见的。
- trx_list: 未提交的事务ID数组;
- up_limit_id : 数组中事务最小的id;
- low_limit_id: ReadView生成时刻系统尚未分配的下一个事务ID,也就是目前已出现过的事务ID的最大值+1。
-
当前事务是如何判断那些版本是可见的呢?有以下规则:
- 不在未提交的事务数组中,并且事务ID< Max或者是自己,对于当前的事务都可见。
-
- 如果新提交了事务,并且当前事务的隔离级别是RC(读已提交),则会重新拿ReadView,读取最新的版本数据。
- 如果新提交了事务,并且当前事务的隔离级别为RR(可重复读) ,则不会重新拿ReadView,读取的还是最开始的历史版本数据。
因此在上面的例子中,如果数据库的事务隔离级别为RC 则结果为 100 108 可见,108 是新提交的事务,ReadView会重新加载
而如果数据库事务隔离级别为RR,则只有100 可见,ReadView还是最开始的历史版本数据。
参考内容:码农架构: https://www.bilibili.com/video/BV1tV411y7sU
标签:事务,--,ReadView,ID,MVCC,版本,MySQL,id 来源: https://www.cnblogs.com/sinlearn/p/14969799.html