Mysql之MVCC

简介:
  • MVCC多版本并发控制,基于快照读实现,提供了mysql非阻塞读,主要依赖的undolog、readview和三个隐式字段。undolog主要用来做回滚的,三个隐式字段分别为隐藏主键、回滚指针、事务id,实现快照读主要依赖readview。
快照读和当前读
  • 快照读就是简单的查询语句
  • 当前读包含select … for update、select … lock in share model、insert、update、delete。
readview:
  • MVCC快照读的主要依据,它包含四个核心字段
    • m_ids:创建快照读时活跃的事务id(所有未提交或回滚的事务id)列表
    • min_trx_id:m_ids列表中最小的事务id
    • max_trx_id:预分配事务id,m_ids列表中最大事务id+1
    • creator_trx_id:当前创建快照的事务id
  • MVCC是如何判断某个版本是否可见的?
    • 如果该版本的事务id等于creator_trx_id,表示当前该版本事务在访问自己修改过的数据,可以访问。
    • 如果该版本的事务id小于min_trx_id,表示该版本在生成视图前已经提交了,可以访问。
    • 如果该版本的事务id大于等于max_trx_id,表示该版本的事务是在创建视图后才开启了,不可以访问。
    • 如果当前版本的事务id在m_ids列表中,表示该版本的事务在创建视图时还在活跃,不可以访问。
    • 如果当前版本大于min_trx_id且小于max_trx_id且不在m_ids中,表示创建视图的时候已经提交,可以访问。
  • MVCC如何通过readview实现隔离级别?
    • read commit:每次快照读都会创建一个视图。
    • repeated read:开启事务后第一个快照读的时候创建的视图,后续沿用该视图。
mysql如何在可重复读的隔离级别下解决了幻读?
  • 对当前读使用了间隙锁解决了幻读
  • 快照读因为是开启事务时创建了视图,后续的插入并不会影响当前视图的数据,解决了幻读
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值