OCC三阶段
- 读阶段
- 所有更新操作缓冲在事务本地内存空间中,维护事务的写集
- 所有读取操作先访问事务本地内存空间,若不存在则从数据库中读取并可选地缓存在事务私有内存空间中,维护事务的读集
- 验证阶段(最关键的阶段)
- 检查待提交事务是否满足可串行化调度
- 写阶段(只读事务不需要)
- 事务私有内存中的更新数据写入数据库使其全局可见
验证过程
- 对事务, ,且 ,则检查事务是否符合可串行化(即在之前完成),需满足如下三种条件之一:
- 在开始读取阶段前完成写入阶段,即在之前提交
- 的写集与的读集不相交,且在开始写入阶段前完成写入阶段
- 的写集与的读集和写集都不相交,且在完成读取阶段前完成读取阶段
算法实现
算法流程
- 维护数据结构
- 每个事务的写集合
wset
,读集合rset
- 全局的活跃事务写集合列表active(活跃事务指已完成读阶段,正在进行验证阶段的事务)
- 全局的已提交事务写集合列表history
- 每个事务的写集合
- 事务开始,读阶段
- 获取开始时间戳
start_ts
- 获取开始时间戳
- 事务结束,进入验证阶段
- 获取结束时间戳
end_ts
,活跃事务列表active
,将自身加入active
- 验证事务
start_ts
和end_ts
之间提交的事务的写集与该事务的读集是否相交 - 验证
active
中的写集与该事务的读集和写集是否相交 - 相交,则发现冲突,在临界区内将本事务从
active
中去除并中止待验证事务 - 不相交,则验证成功,执行写入阶段
- 在临界区内将本事务从
active
列表中去除
- 获取结束时间戳
- 读操作
- 将读操作所读的数据加入事务的读集合
rset
- 将读操作所读的数据加入事务的读集合
- 写操作
- 将写操作所写的数据加入事务的写集合
wset
- 将写操作所写的数据加入事务的写集合
实现代码参考这里