MySQL-08-MVCC

一、什么是MVCC

  1. 即多版本并发控制
  2. MVCC在MySQL的InnoDB中的实现主要是为了提高数据库并发性能,达到读-写不冲突,此处的读是快照读

二、什么是当前读和快照读?

  1. 快照读就是最普通的Select语句,例如:select * from user whereid=1,
    他读取的是一个快照,也就是历史记录,不一定是最新的数据,取决于你能读到什么(涉及隔离级别)
  2. 当前读指执行下列语句时的读取的方式,可以理解为读到了最新的数据,会去加锁
    Insert、Update、Delete、Select…for update (排他锁)
    Select…lock in share mode (共享锁)

三、MVCC的实现原理

  1. 三个隐式字段
    DB_TRX_ID
    最近修改(修改/插入)事务ID:记录(创建/最后一次修改)该记录的事务ID
    DB_ROLL_PTR
    回滚指针,指向这条记录的上一个版本(存储于rollback segment里)
    DB_ROW_ID
    隐含的自增ID(隐藏主键),如果数据表没有主键,则会自动产生
    实际还有一个删除flag隐藏字段, 既记录被更新或删除并不代表真的删除,而是删除flag变了

    结构图解如下
    **加粗样式**

  2. undo日志(二种)

    1. insert undo log
      事务在insert新记录时产生,只在事务回滚时需要,并且在事务提交后可以被立即丢弃

    2. update undo log
      事务在update或delete时产生不仅在回滚时需要,在快照读时也需要,所以不能随便删除,由purge线程统一清除

    从前面的分析可以看出,为了实现InnoDB的MVCC机制,更新/删除操作都只是设置老记录的flag,并不真正将过时的记录删除。为了节省磁盘空间,InnoDB有专门的purge线程来清理flag为true的记录。为了不影响MVCC的正常工作,purge线程自己也维护了一个read view(这个read view相当于系统中最老活跃事务的read view,如果某个记录的flag为true,并且DB_TRX_ID相对于purge线程的read view可见,那么这条记录一定是可以被安全清除的。

    下面我们看看undolog 记录了啥。假如入我们不停的修改一条数据,那么undo的版本链则如下:(注意,主键存在的情况下,不生成隐式ID)
    在这里插入图片描述

  3. Read View (ReadView是一个数据结构,包含4个字段)

    1. m_ids:当前活跃的事务编号集合
    2. min_trx_id:最小活跃事务编号
    3. max_trx_id:预分配事务编号,也就是当前最大事务编号+1
    4. creator_trx_id:ReadView:创建ReadView的事务编号

RR级别下,解决不可重复读问题

RR-另一种类似幻读问题
在这里插入图片描述
我们可以看出这样一种现象,单纯的插入可以解决幻读,但是如果修改数据后就能读到,插入重复/删除数据都是可以操作的,也就是意味着能读到数据。
思考:插入,删除和更新都属于当前读不走MVCC的快照,能读到也很正常,但是为什么更新之后也能读到呢,这里个人感觉是更新之后增大了当前事务的读取范围,读到了最新事务的数据。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值