MVCC (Multiversion Concurrency Control) 多并发版本控制

11 篇文章 0 订阅

不同事物在同一时刻看到的数据可能是不同的(事务之间的隔离性),同一事物在不同时刻看到的数据一定是相同的(repeatable read)。我们首先会通过mysql的InnoDB引擎保证这一点。

上面那句话我说的,不保证正确哈哈哈

以下针对的是MySQL InnoDB的实现方式:

原理:

MVCC提供基于某个时间的快照,使得对于事务看来,总是可以提供与事务开始时刻相一致的数据,而不管这个事务执行的时间有多长,故在不同事务看来,同一时刻看到的相同的行数据可能是不一样的,即:每一行数据会有多个版本数据(副本)
InnoDB中每行隐含2个字段:
新增或修改版本号删除版本号(可以为空)

每一个事务开始也有自己的版本号且是递增

以select,delete,insert update语句来说明:

  1. 记录该行数据的创建事务ID 我们称为A列
  2. 记录该行数据的删除事务ID 我们称为B列

然后每个事务都会创建一个自增的ID, 然后在相应的行为下将事务ID更新到数据的这两列中。

针对不同的行为做一下解释:

Select

InnoDB会根据以下两个条件检查每行记录

  1. 只会查找A列早于当前事务ID的数据行(也就是说,该行的创建版本号小于等于当前事务ID),这样可以确保事务读取的行要么是在事务开始前已经存在的,要么是事务自身插入或者修改过的。
  2. 行的B列要么undefined要么大于当前事务ID。这可以保证当前事务读取的行未被删除。

Delete

InnoDB会为删除的每一行保存当前的事务ID作为删除标识(B列)。

Update

InnoDB执行Update,本质上等同于新增一条记录并保存该操作的事务ID(A列),同时保存当前事务ID到该行的删除记录列(B列)。

MVCC优缺点:
优点: 在读取数据时,innodb几乎不用获取任何锁,在每个查询通过版本检查,只获取需要的数据版本,提高系统并发度
缺点: 为了实现多版本,innodb必须对每行增加相应字段来存储版本信息,同时需要维护每一行的版本信息,而且在检索行的时候,需要进行版本的比较,因而减低了查询效率;innodb还需要定期清理不再需要的行版本,及时回收空间,这也增加开销;


关于删除版本号有点绕口,这里单独拿出来说一下。

为空或者删除版本号大于当前事务版本号。

  1. 为空这点想必不用过多解释,就说明这行没有被修改过
  2. 为什么大于当前事务版本号的可以被select出来呢? 小于等于代表着之前存在事务或者本事务已经把这条带着版本号的记录删除了,自然这条数据就不应该被select出来。 大于的事务,那是未来的修改情况,你这个事务管不着,所以大于的情况就应该被select出来
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值