MVCC是什么?

12 篇文章 0 订阅

MVCC,Multi-Version Concurrency Control,多版本并发控制 

 

数据库有四种隔离级别,通过MVCC在每种查询下的情况也是不一样的。

在每次insert 、update 、delete都会生成一个事物id,事物id 是递增的。聚簇索引记录中都包含两个必要字段 trx_id 、roll_pointer ,每次修改都会生成undo日志(insert没有,因为没历史)。

这里有几个主要就是概念就是版本链、readview。

版本链:

对于使用`InnoDB`存储引擎的表来说,它的聚簇索引记录中都包含两个必要的隐藏列(`row_id`并不是必要的,我们创建的表中有主键或者非NULL唯一键时都不会包含`row_id`列)

- `trx_id`:每次对某条聚簇索引记录进行改动时,都会把对应的事务id赋值给`trx_id`隐藏列。

- `roll_pointer`:每次对某条聚簇索引记录进行改动时,都会把旧的版本写入到`undo日志`中,然后这个隐藏列就相当于一个指针,可以通过它来找到该记录修改前的信息。

  

Readview:

 主要包含当前系统中还有哪些活跃的读写事务,把它们的事务id放到一个列表中,把这个列表命名为为`m_ids`,根据版本链trx_id 和m_ids 的比较来进行版本选择(具体规则可以自己查查)

(每种隔离级别也不太一样)
- READ COMMITTED(用到版本链):每次读取数据前都生成一个ReadView(在每一个select操作前都生成ReadView)
- REPEATABLE READ(用到版本链):在第一次读取数据时生成一个ReadView(只在第一次进行普通`SELECT`操作前生成一个`ReadView`)
- READ UNCOMMITTED: 直接读取记录的最新版本
- SERIALIZABLE:使用加锁的方式来访问记录

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值