Mysql多版本并发控制(MVCC)
2020-04-01 本文已影响0人
万福来
Mysql多版本并发控制(MVCC)
MVCC是个行级锁变种,他在普通读情况下避免了加锁操作,因此开销更低。实现了非阻塞读,对于写操作只锁定必要的行。
-
一致性读(就是读取快照)
select * from table .....; -
当前读(就是读取实际的持久化的数据)
特殊的读操作,插入/更新/删除操作都属于当前读,处理的都是当前的数据,需要加锁。select * from table where ? lock in share mode; select * from table where ? for update; insert; update ; delete;
-
InnoDB通过在每行数据后边保存两个隐藏的列来实现(其实有三列,第三列用于事务回滚)
第一列保存了行的创建版本号,第二列保存了行的更新版本号。这个版本号是每个事务的版本号,递增的。
select无锁操作与维护版本号
- Select (快照读,就是读取当前事务之前的数据)
1、InnoDB只select查找版本号早已当前版本号的数据行,这样保证了读取的数据要么是在这个事务开始之前commit的,要么是这个事务自身中执行创建操作的数据(等于当前版本号)
2、查找行的更新版本号要么未定义,要么大于当前版本号,保证了事务读取到在当前事务开始之后的未被更新的数据。 - Insert
InnoDB为这个事务中新插入的行,保存当前事务版本号的行作为行的行创建版本号。 - Delete
InnoDB为每一个删除的行保存当前事务版本号,作为行的删除标记。 - Update
将存在两条数据,保持当前版本号作为更新后的数据的新增版本号,同时保存当前版本号作为老数据行的更新版本号。