基于时间戳的并发控制

本文介绍了基于时间戳的并发控制TO算法,详细阐述了读操作、预写操作和写操作的流程,并给出了代码实现,包括数据结构和操作步骤。在TO算法中,通过维护时间戳确保事务的正确执行,避免并发问题。代码已上传至GitHub,包括全局配置、并发控制算法和读写操作的实现。

实现基于时间戳的事务处理原型。

TO算法流程

  • 维护若干时间戳
    • 事务时间戳:以事务开始时间标识事务的先后顺序,表示为ts(T)
    • 数据项读写时间戳:记录读写该数据的最新事务的时间戳,表示为r_ts(X), w_ts(X)
  • 另每个数据项x有三个队列,分别为读队列dm_read(x),写队列dm_write(x),预写队列dm_pre(x)。min_R_ts(x),min_P_ts(x)分别为读队列最小时间戳和预写队列最小时间戳。
  • 同一事务后续的写失败导致之前的写撤销,引发一系列异常
    • 所有写均不能直写数据,需先预写成功,再进行数据的修改
  • 事务对某数据进行第一次读后,其他事务修改该数据,导致不可重复读
    • 读操作copy出一份数据,后续对该数据的读都在该副本上操作

读操作

  • 若读时间戳小于数据的写时间戳,ts®<w_ts(x),abort;
  • 若读时间戳大于预写队列的最小时间戳,ts®>min_P_ts(x),则暂时不能执行,先缓存到dm_read(x);
  • 否则,则可以直接执行读操作。

预写操作

  • 所有的写操作都先做预写,为了避免级联回滚,即pre_write
  • 若预写时间戳小于数据的读或写时间戳,ts§<R_ts(x)或W_ts(x),abort;
  • 否则,缓存到预写队列dm_pre(x)中;

写操作

  • 若写请求时间戳大于min_P_ts(x)或min_R_ts(x),缓存到写请求队列dm_write(x)中
  • 否则,直接执行
    • 每执行一个写操作,min_P_ts(x)增大,执行小于该时间戳的读操作;相应的,min_R_ts(x)增大,执行小于该时间戳的写操作
    • 其实相当于将读队列和预写队列的请求按时间戳从大到小依次执行

代码说明

本人完成的代码原型已经上传到GitHub

代码结构

  • global.h:全局配置及变量
  • data_to.h/.cpp:基于时间戳的并发控制的算法
  • cc_to.h/.cpp:基于时间戳的读写操作实现
  • main.cpp:程序入口,测试程序的实现

算法实现

  • 读操作
    • 由cc_lock中get()实现,调用data_to中access(),请求类型为R_REQ
  • 写操作
    • 由cc_lock中update()实现,先调用access(),请求类型为P_REQ
    • 若P_REQ执行成功,再调用access(),请求类型为W_REQ
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值