mysql mvcc介绍

一、什么是mvcc

MVCC,即Multi-Version Concurrency Control (多版本并发控制)。它是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存。

二、什么时候会出现并发问题

  • 读-读;(不会),不需任何操作,不会出现并发问题
  • 读-写;(会),mvcc就是为了解决读写的并发事务问题,不加锁,快照读,效率快。
  • 写-写;(会),mvcc无能为力,所有涉及写写的操作都是通过加锁实现。

三、mvcc解决了什么问题

mvc解决了并发’读-写’下的数据不一致问题。针对的是mysql中读已提交和可重复读的隔离级别。

四、mvcc前置知识点

  1. 事务版本号
    事务每次开启前,都会从数据库获得一个自增长的事务ID,可以从事务ID判断事务的执行先后顺序。

  2. 两个行记录字段
    trx_id:记录操作这条记录的事务id
    roll_pointer:指向回滚段的undolog

  3. undolog
    undolog,回滚日志,记录的是操作的反向操作,例如:每有一条insert语句会生成一条对应的delete语句。
    undolog两个作用:
    事务回滚时,保证事务一致性和原子性;
    mvcc快照读。

  4. 版本链
    多个事务并行操作某一行数据时,不同事务对该行数据的修改会产生多个版本,然后通过回滚指针(roll_pointer),连成一个链表,这个链表就称为版本链。

  5. 快照读和当前读
    快照读:指的是读取的是快照,并不一定是数据库实际数据。所有的普通select读都是快照读。
    当前读:读取的数据库实际数据,也就是最新版本数据。显示加锁读的才是当前读

     select * from order where id > 10 for update;
     select & from order where id > 10 lock in share mode;
    
  6. Read View
    6.1 Read View 就是我们前面说的快照。在事务里面,出现普通select语句时,就会生成对应的Read View读快照。不通的隔离级别生成的时机不一样:
    - 读已提交(RC):每次select语句出现时都生成一个Read View;
    - 可重复读(RR):第一次select语句出现时才生成一个Read View,后续select语句并不会生成新的Read View。

    6.2 Read View里面的字段:
    - m_ids:当前系统中那些活跃(未提交)的读写事务ID, 它数据结构为一个List。
    - min_limit_id:表示在生成ReadView时,当前系统中活跃的读写事务中最小的事务id,即m_ids中的最小值。
    - max_limit_id:表示生成ReadView时,系统中应该分配给下一个事务的id值。
    - creator_trx_id: 创建当前read view的事务ID

五、mvcc实现原理

mvcc是依靠 “undolog链 + readview” 实现,两个不同的隔离级别生成readview的时机不同。
读已提交(read commited):每次select语句都生成readview。
可重复读(read repeated):第一次select语句生成readview,后续的select公用这个readview。
读取规则:

  1. 如果被访问的版本trx_id,小于readview里面的min_limit_id最小的事务id,那说明当前版本数据是在生成readview之前就提交了,所以可以该版本可以被当前事务访问;
  2. 如果被访问的版本trx_id,大于readview里面的max_limit_id最大的事务id,那说明当前版本数据是在生成readview之后才生成的,所以该版本不可以被当前事务访问;
  3. 如果被访问的版本trx_id,在max_limit_id和min_limit_id之间,说明,当前版本数据是在生成readview期间生成的,如果trx_id存在m_ids里面,说明此时该版本事务还没有提交,所以不能被当前事务访问;如果trx_id不存在m_ids里面,说明此时该版本事务已经提交了,所以可以被当前事务访问。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

koral chen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值