1.4. 多版本并发控制
MVCC:可以认为是行级锁的变种,避免加锁的情况下实现了非阻塞读操作,写操作也只锁定必要的行。通过保存数据在某个时间点的快照进行实现。各个事务看到的数据始终保持一致。
类型:乐观MVCC、悲观MVCC。
Id | Name | Sex | Age | CreateSVN | DeleteSVN |
---|---|---|---|---|---|
1 | canaan | 1 | 23 | 1 | 2 |
2 | canaan | 1 | 24 | 2 |
InnoDB MVCC实现方式:每行记录后保存创建、删除时系统版本号(SVN)即事务版本号,用来和当前事务进行比较,以判断当前事务对此记录是否可见。 currentSVN >= CreateSVN and current < deleteSVN 即可见。
Insert操作设置CreateSVN、Delete操作设置DeleteSVN。Update操作新写入一行设置CreateSVN为当前事务版本号后,设置之前行DeleteSVM为当前事务版本号。(猜想:应为原子操作,不为原子操作会出现后面事务从一行读到多行的情况,虽然可能很短暂。)
优缺点:优点时大多数读操作不用加锁,缺点是每行记录都需要额外的存储空间,需要更多的检查维护。
MVCC只在可重复读和提交读下工作,其它两个隔离级别和MVCC不兼容。未提交读总是读取最新行而不是事务角度下的数据,串行化会对所有行加锁。