MVCC-多版本并发控制
作者:互联网
- 理解快照读和当前读
- 快照读:一致性不加锁的读,在可重复读的隔离级别下,每次事务启动之前都会对当前库拍一个快照,当前事务读取的数据要么是事务开启时快照的数据,要么是事务本身插入或更新的数据;
- 当前读:当前最新的数据,开启后能在事务中读取到其他已提交事务的最新数据;如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操作如下:
- SELECT:只查找版本早于或等于当前事务版本的数据行,行的删除版本要么未定义,要么大于当前事务版本号;
- INSERT:将当前系统版本号作为插入的每一行的版本号;
- UPDATE:保存当前版本号为行版本号,同时保存当前版本号到原来的行作为删除标识;
- DELETE:为删除的每一行保存当前系统版本号作为行删除标识;
MCVV只在读已提交和可重复度隔离级别下工作,因为读未提交下总是读取到最新到数据,不满足当前事务版本的数据行,而串行化会给每一读取到的行加锁。
标签:事务,rows,快照,版本,版本号,并发,当前,MVCC,读取 来源: https://www.cnblogs.com/sunql/p/16078912.html