MVCC(多版本并发控制)

1、介绍

MVCC,多版本并发控制,解决的问题:判断当前事务对某行记录是否可见(能否读取到刚刚修改的最新的结果值),这里有个可见性算法,在介绍算法之前,我们先补充两个概念和MVCC的底层原理。
两个概念:

  1. 当前读:读取的是数据的最新版本,总是读到最新数据,如以下几种的 sql语句:
    a、select……lock in share mode
    b、select……for uodate
    c、update……
    d、delete……
    e、insert……
  2. 快照读:读取的是历史版本的记录,sql语句如select……

底层原理:
MVCC包括三部分:

  1. 第一部分是隐藏字段,表中每一行记录都会有几个用户不可见的隐藏字段,

    1. DB_TRX_ID:创建或者最后一次修改该记录的事务的id;
    2. DB_ROW_ID :隐藏主键(如果没有设置主键,且表中没有找到唯一不 为空且为整数型的字段时生成
    3. DB_ROW_PTR:回滚指针,指向记录的上一个版本
  2. 第二部分

    1. undolog:回滚日志,在事务的修改记录之前,会把该记录的原值先保存起来再做修改,以便修改过程中出错能够恢复原值或者其他的事务读取。当不同的事务对一条记录修改的时候,会导致该记录的undolog形成一个线表,也就是链表,链表的链首是最新记录,而链尾是最早的历史记录。
  3. 第三部分

    1. readview :事务在进行快照读的时候产生的读视图,它也有三个字段:
      1. trx_list:系统活跃的事务id
      2. up_limit_id: 列表中事务最小的id
      3. low_limit_id:系统尚未分配的下一个事务的id

接下来,我们介绍可见性算法规则:

  1. 首先比较DB_TRX_ID<UP_LIMIT_ID,如果小于,则当前事务能看到DBTRX_ID所在的记录;如果大于等于,则进入下一个判断
  2. 接下来判断DB_TRX_ID>=LOW_LIMIT_ID,如果大于等于,则代表DB_TRX_ID所在的记录在READ_VIEW生成后才出现的,那么对于事务肯定不可见;如果小于,则进入下一步判断
  3. 判断DB_TRX_ID是否在活跃事务中,如果在,咋代表在READ_VIEW生成时刻,这个事务还是在活跃状态,还没有commit修改的数据,当前事务也是看不到,如果不在,则说明这个事务在 READ_VIEW生成之前就已经开始commit,那么修改的结果就是可见的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值