MySql中mvcc学习记录

1、解决的问题

  • 主要是为了解决并发读的问题(锁机制是解决并发写的问题)

2、实现原理

  • 数据库中的每条数据会有两个隐藏的字段,1、修改或插入这条数据执行的事物id 2、上一个版本的roll_point指针,指向上一个版本的undo_log

3、ReadView机制

  • 每次开启一个新的事物的时候会生成一个ReadView视图,readview中包含4个重要的字段
  • m_ids列表(当前开始事物时数据库中活跃的还未提交的事物id列表)
  • min_trx_id 当前活跃事物中最小的事物ID
  • max_trx_id 当前活跃事物中最大的事物ID
  • creator_trx_id 当前事物的ID

4、数据库并发读会产生的问题

  • 读未提交-脏读
  • 读已提交-不可重复读,幻读

5、mvcc如何解决上述问题

  • 数据库每次开启一个事物的时候会生成一个ReadView视图,
  • 按照sql的执行条件先找到满足条件的数据
  • 然后看该条数据上2个隐藏的字段其中的一个事物id
    • 判断该条数据中的事物id是否小于ReadView中的min_trx_id,如果小于说明在本次事物开启之前这条数据已经被修改被提交了,则可以查询到
    • 判断该条数据中的事物ID是否等于ReadView中的creator_trx_id,如果等于说明这个数据是被本次事物中的某一条sql语句更新了,自己的事物更新的是可以读取到最新的值
    • 判断该条数据中的事物id是否大于等于ReadView中的max_trx_id,如果是则说明这条数据已经被本次事物开启之后的后面的事物修改并提交了,则不能读取,这时候按照该条数据中指向上一个版本的指针找到上一个版本的数据然后再进行事物id的对比(可解决不可重复读的问题)
    • 如果数据中的事物ID大于ReadView中的最小事物ID,小于ReadView中的最大事物ID时,则判断该数据的事物ID是否在ReadView的活跃事物m_ids列表中,如果在,则代表我Read View生成时刻,你这个事务还在活跃,还没有Commit,你修改的数据,我当前事务也是看不见的;如果不在,则说明,你这个事务在Read View生成之前就已经Commit了,你修改的结果,我当前事务是能看见的
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值