MVCC-多版本并发控制

2022/3/30 23:24:40

本文主要是介绍MVCC-多版本并发控制,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

  • 理解快照读和当前读
  1. 快照读:一致性不加锁的读,在可重复读的隔离级别下,每次事务启动之前都会对当前库拍一个快照,当前事务读取的数据要么是事务开启时快照的数据,要么是事务本身插入或更新的数据;
  2. 当前读:当前最新的数据,开启后能在事务中读取到其他已提交事务的最新数据;如for update, lock in share model;

for update 与 lock in share model 两者区别:

for update用于给符合条件的rows加上IX(意向排它锁),加锁后,其他事物不能读取或修改当前被锁定的rows,但innodb存在一致性非锁定的读,所以能读取对应的快照读,所以不会阻塞其他事务对锁定rows的快照度;

lock in share model用于给符合条件的rows加上IS(意向共享锁)。加锁后,其他事物能读取对应的rows,也能给对应的rows加IS锁,但是无法修改当前锁定的rows,直到锁定的session已经提交;

 

  • InnoDB中MVCC:

InnoDB中MVCC是通过两个隐藏列来实现的,用于保存行的创建时间和过期时间(删除时间);这里所谓的时间不是实际的时间值,而是系统版本号(system version number)。当session开启时,系统版本号都会自动递增,作为当前session的版本号,用来和查询到到每行记录到版本做比较。

在可重复度隔离级别下,MVCC操作如下:

  1. SELECT:只查找版本早于或等于当前事务版本的数据行,行的删除版本要么未定义,要么大于当前事务版本号;
  2. INSERT:将当前系统版本号作为插入的每一行的版本号;
  3. UPDATE:保存当前版本号为行版本号,同时保存当前版本号到原来的行作为删除标识;
  4. DELETE:为删除的每一行保存当前系统版本号作为行删除标识;

MCVV只在读已提交和可重复度隔离级别下工作,因为读未提交下总是读取到最新到数据,不满足当前事务版本的数据行,而串行化会给每一读取到的行加锁。

 



这篇关于MVCC-多版本并发控制的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程