数据库系统实现(索引读场景)

      在进行读的过程中,没有写操作的情况下,进行TREE NODEID查找,检查是否KEY 超过MAX,  TREENODEID 文件中没有满的情况下,需要MAX值不一定是最大的,所以要进行MSGBUFFERLIST的查找,其中有可能有大于MAX的情况;当TREENODEID文件中满的情况下,MAX是最大的,加入KEY大于MAX的一定放在下一级。

       有写操作的情况下,处理复杂,修改的数据有MSGBUFFERLIST, COUNTER, MAX, 上一级CALLBACKLIST, TREENODEID文件数据, ROOTBUFFERLIST数据,不同时机点,两个任务分别对应不同的数据。

场景1:读某一KEY,首先判断ROOTBUFFER,此时ROOTBUFFER和READ KEY在一个任务中,不会有读写冲突,而且是乒乓BUFFERLIST, 数据是最新的,相同KEY的情况是存在的,FILE中的数据一定是旧的,根据乒乓FLAG进行 ROOTBUFFERLIST的选择,进行遍历查找。

场景2:对某一LEVEL的MSGBUFFERLIST进行读写,MSGBUFFERLIST数据的修改也是和READ KEY在同一个任务中,不会有读写冲突,只是MSGBUFFERLIST的数据有可能此时也写到文件中或者是CALLBACKLIST 中,有重复的情况,等写盘的消息发过来后才会进行修改。

场景3:对某一LEVEL的CALLBACKLIST进行读写,在下推的过程中,数据是不变化的,和READ KEY不会有读写冲突,和MSGBUFFERLIST 下推过程处理一致,需要标记来表示下推过程(另外一个任务在写盘,数据本身不变化);上一级在写入的过程中,上一级 FILE写的任务进行CALLBACKLIST的写,数据是变化的,和READ KEY有读写竞争;

场景4:对MAX, COUNTER进行判断的过程中,有读写竞争,MAX和COUNTER都是由写文件的任务进行修改,进行判断时(可以通过对不同的TREENODEID进行标记,MSGBUFFERLIST 和CALLBACKLIST下推过程中关联了哪些TREENODEID,定义为PUSHFLAG), 对于没有关联的还是可以直接读写的,不会引起冲突;当COUNTER不满的情况下,MAX是变大的趋势; 当COUNTER满的情况下,MAX是变小的趋势;当MAX是变小的趋势时,进行判断大于是可以进行继续向下级查找的,下一级和CALLBACKBUFFERLIST中进行查找,CALLBACKBUFFERLIST有可能正在写,存在竞争;当MAX时变大的趋势时,数据有可能在MSGBUFFER和TREENODEID文件中,进行大于判断继续向下查就不行;

场景5:CALLBACKBUFFERLIST对下一LEVEL的影响,CALLBACK COUNTER加上下一级MSGBUFFERLIST 小于MSGBUFFERLIST  NUM时,  将CALLBACK的数据COPY到MSGBUFFER中;如果总数大于MSGBUFFERLIST NUM时,将数据COPY到CALLBACKBUFFERLIST, 上一级数据不可以进行写盘操作,可以追加到MSGBUFFERLIST中,数据要锁定两LEVEL。在进行本LEVEL的写盘操作的过程,首先是本LEVEL的CALLBACK BUFFERLIST为空,不是空的情况下退出,等下一次的检查。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值