投票网站设计,德阳企业品牌网站建设,动漫设计与制作图,wordpress七牛不显示小图参考链接#xff1a;一文读懂MVCC实现原理_Nicolos_Z的博客-CSDN博客
1.总述#xff1a;
MVCC 主要是InnoDB解决数据库事务读写#xff0c;导致的脏读、重复读问题的处理方法。通过快照读的方式#xff0c;提高数据库并发查询的能力。
2.MVCC的实现
实现MVCC主要用到了…参考链接一文读懂MVCC实现原理_Nicolos_Z的博客-CSDN博客
1.总述
MVCC 主要是InnoDB解决数据库事务读写导致的脏读、重复读问题的处理方法。通过快照读的方式提高数据库并发查询的能力。
2.MVCC的实现
实现MVCC主要用到了数据库隐式字段、undolog、readview三个组件。
2.1 组建介绍
2.2.1 隐式字段
DBTRXID 上一次提交事务的ID
DBROLLPTR 回滚版本指针
DBROWID 表唯一键指向undolog地址
2.2.2 undolog
如下图所示为链表结构回滚指针DBROLLPTR指向上一个版本的回滚日志。 2.2.3 readview
Read View是事务进行快照读操作的时候生产的读视图用于可见性判断。
假设有四个事务同时在执行如下图所示
事务1事务2事务3事务4事务开始事务开始事务开始事务开始..................修改且已提交进行中快照读进行中..................
2.2.3.1 readview 包含三个元素
trx list: 在该事务(2)执行快照读的那一刻会生成一个数据系统当前的快照记录并维护系统当前活跃事务的id(1,3)事务的id值是递增的。
uplimitid: 记录trx_list列表中事务ID最小的ID1
lowlimitid: Read View生成时刻系统尚未分配的下一个事务ID5 2.2.3.2 readview 可见性判断规则例针对TRX2是否可见TRX4
1、比较DBTRXID4 uplimitid1, 如果小于则当前事务能看到DBTRXID所在的记录如果大于等于进入下一个判断
2、接下来判断DBTRXID 4 lowlimitid5, 如果大于等于则代表DBTRXID所在的记录在Read View生成后才出现的那么对于当前事务肯定不可见如果小于则进入下一步判断
3、判断DBTRXID4是否在活跃事务中如果在则代表在Read View生成时刻这个事务还是活跃状态还没有commit修改的数据当前事务也是看不到如果不在则说明这个事务在Read View生成之前就已经开始commit那么修改的结果是能够看见的。
3. RC、RR级别下的InnoDB快照读
RC:
在RC隔离级别下是每个快照读都会生成并获取最新的Read View.(不可重复读)
RR:
在RR隔离级别下则是同一个事务中的第一个快照读才会创建Read View之后的快照读获取的都是同一个Read View.
4.MVCC为什么不能解决幻读
MVCC可以解决幻读问题但是仅能解决快照读时的幻读问题。想要解决当前读的幻读问题需要加间隙锁可以使用lock in share mode 或 for updatemysql会自动加上间隙锁锁住区间。
MySQL(九)MVCC能否解决幻读问题_mvcc为什么不能解决幻读_星河之码的博客-CSDN博客