Mysql-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最小的ID(1)

lowlimitid: Read View生成时刻系统尚未分配的下一个事务ID(5)

 2.2.3.2 readview 可见性判断规则(例针对TRX2是否可见TRX4):

1、比较DBTRXID(4) < uplimitid(1), 如果小于,则当前事务能看到DBTRXID所在的记录,如果大于等于进入下一个判断

​ 2、接下来判断DBTRXID (4)>= lowlimitid(5), 如果大于等于则代表DBTRXID所在的记录在Read View生成后才出现的,那么对于当前事务肯定不可见,如果小于,则进入下一步判断

​ 3、判断DBTRXID(4)是否在活跃事务中,如果在,则代表在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 update,mysql会自动加上间隙锁,锁住区间。

MySQL(九):MVCC能否解决幻读问题_mvcc为什么不能解决幻读_星河之码的博客-CSDN博客

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值