目的
在尽可能避免加锁操作的情况下,实现可重复读。
实现原理
在每行记录后面保存两个隐藏的列,这两个列中用两个版本号来表征下面两个时间:
1. 行的创建时间。
2. 行的过期时间(或者删除时间)。
这里的“时间”指的是系统版本号。每开始一个新的事务,系统版本号就会自动递增。
操作过程
select
根据以下两个条件检查每行记录:
1. 行的创建时间要早于当前事务版本。
2. 行的删除时间要么没有定义,要么晚于当前事务版本。
只有同时满足以上两个条件,才会返回查询结果。
insert
在新增加的行,添加当前系统版本号作为创建时间。
delete
在删除的行,添加当前系统版本号作为删除时间
update
插入一行新记录,添加当前系统版本号作为创建时间,同时保存当前系统版本号到原来的行作为行删除标识。
不足之处
每行记录都需要额外的存储空间,需要做更多的行检查工作,以及一些额外的系统维护工作。