OCC三阶段

  • 读阶段
    • 所有更新操作缓冲在事务本地内存空间中,维护事务的写集
    • 所有读取操作先访问事务本地内存空间,若不存在则从数据库中读取并可选地缓存在事务私有内存空间中,维护事务的读集
  • 验证阶段(最关键的阶段)
    • 检查待提交事务是否满足可串行化调度
  • 写阶段(只读事务不需要)
    • 事务私有内存中的更新数据写入数据库使其全局可见

验证过程

  • 对事务TiT_i , TjT_j ,且 Ti<TjT_i<T_j,则检查事务TjT_j是否符合可串行化(即TiT_iTjT_j之前完成),需满足如下三种条件之一:
    • TiT_iTjT_j开始读取阶段前完成写入阶段,即TiT_iTjT_j之前提交
    • TiT_i的写集与TjT_j的读集不相交,且TiT_iTjT_j开始写入阶段前完成写入阶段
    • TiT_i的写集与TjT_j的读集和写集都不相交,且TiT_iTjT_j完成读取阶段前完成读取阶段

算法实现

算法流程

  • 维护数据结构
    • 每个事务的写集合wset,读集合rset
    • 全局的活跃事务写集合列表active(活跃事务指已完成读阶段,正在进行验证阶段的事务)
    • 全局的已提交事务写集合列表history
  • 事务开始,读阶段
    • 获取开始时间戳start_ts
  • 事务结束,进入验证阶段
    • 获取结束时间戳end_ts,活跃事务列表active,将自身加入active
    • 验证事务start_tsend_ts之间提交的事务的写集与该事务的读集是否相交
    • 验证active中的写集与该事务的读集和写集是否相交
    • 相交,则发现冲突,在临界区内将本事务从active中去除并中止待验证事务
    • 不相交,则验证成功,执行写入阶段
    • 在临界区内将本事务从active列表中去除
  • 读操作
    • 将读操作所读的数据加入事务的读集合rset
  • 写操作
    • 将写操作所写的数据加入事务的写集合wset

实现代码参考这里

results matching ""

    No results matching ""