深入理解MySQL数据库——多版本并发控制(MVCC)

多版本并发控制,MVCC允许数据具有多个版本,这个版本可以是时间戳或者是全局递增的事务ID,在同一时间点,不同的事务看到的数据是不同的。

由于在update操作之前,不能影响已有数据的一致性,所以不会改变旧的数据,update操作会被拆分成insert+delete。需要标记删除旧的数据,insert新的数据。只有update提交之后,才会影响后续的读操作。而对于读操作来说,只能读到在其之前的所有写操作,正在执行中的写操作对其是不可见的。(读不加锁,读写不冲突)

InnoDB会为每一行添加两个字段,分别表示该行创建的版本和删除的版本,填入的是事务的版本号,这个版本号随着事务的创建不断递增。在repeated read的隔离级别下,具体各种数据库操作的实现:

select:满足以下两个条件能够查询成功:

(1)该行的创建版本号小于等于当前版本号,用于保证select操作之前所有的操作已经执行落地。

(2)该行的删除版本号大于当前版本或者为空。删除版本号大于当前版本意味着有一个并发事务将该行删除了。

insert:将新插入的行的创建版本号设置为当前系统版本号

delete:将要删除的行的删除版本号设置为当前系统版本号。

update:不执行原地update(相当于写操作),而是转换成insert+delete。将旧行的删除版本号设置为当前版本号,并将新行insert同时设置创建版本号为当前版本号。

其中,写操作(insert,delete和update)执行时,需要将系统版本号递增。

由于旧数据并不真正的删除,所以必须对这些数据进行清理,Innodb会开启一个后台线程执行清理工作,具体的规则是将删除版本号小于当前系统版本的行删除,这个过程叫做purge。

通过MVCC很好的实现了事务的隔离性,可以达到repeated read级别,要实现serializable还必须加锁。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值