HugeGraph之锁的使用场景分析

本文详细分析了在处理vertexlabelremove、edgelabelremove、indexlabelremove和indexlabelrebuild等场景时,如何利用读写锁确保数据一致性。重点讲解了加锁策略和解锁规则,以及为何只针对特定操作加锁。了解这些场景有助于开发者理解如何在高并发环境下避免数据不一致问题。
摘要由CSDN通过智能技术生成

锁的使用场景分析

概述

对存在冲突的操作,使用读写锁进行同步,耗时操作抓取 Write Lock,短时操作抓取 Read Lock

目前仅用于耗时较长的容易出现数据不一致问题的场景,如index remove、index rebuild、vertex label remove和edge label remove

场景描述

vertex label remove

  1. 检查是否有包含该vertex label的edge label,有则报错;无则继续
  2. 删除vertex label相关的所有index data
  3. 删除vertex label相关的所有的vertices
  4. 删除vertex label元数据

edge label remove

  1. 删除edge label相关的所有index data
  2. 删除edge label相关的edges
  3. 删除edge label元数据

index label remove

  1. 删除所有indexLabel的index data
  2. 删除vertex label或edge label中的indexNames
  3. 删除index label元数据

index label rebuild

  1. 删除index label的index data
  2. 根据index label的信息(base_type, base_value, fields)或者vertex label信息或者edge label信息,依次为vertex或者edge重建索引

注:

  • index重建依赖于updateIndex函数
  • vertex label和edge label的其他操作无需加锁,只有remove需要
  • index label的create过程也会调用rebuild

加锁情况

下表中Y表示冲突,需要加锁,N表示无冲突,无需加锁

Write lock\read lockAVRVAVPRVPAEREAEPREPQ
1vertex label removeYNYNNNNNY
2edge label removeNNNNYNYNY
3index label removeYNYYYNYYY
4index label rebuildNNNNNNNNY

纵向1-4为耗时较长的复杂操作,需要加 Write Lock;横向为简单CRUD,如果有冲突需要加 Read Lock

根据上述流程,可知锁的范围为:

包含
vertex label removeindex label remove
edge label removeindex label remove

说明:

  • 1AV(2AE),删除vertex label包含删除所有相关vertices,AV会增加一个vertex,应该分别锁vertex label的write和read
  • 1RV,RV发生在vertex label remove期间,多次删除vertex不会有问题,如果vertex label还在,正常进行;如果vertex label不在了,则报异常vertex label不存在,可接受
  • 1AVP(2AEP),vertex已经删除,AVP会在vertex不存在的情况下,创建一个新的vertex(append特性)
  • 1RVP,删除vertex property,如果不存在vertex,也不报错;如果存在,则删除property,后续vertex最终会被删除掉
  • 1AE、1RE、1AEP、1REP与vertex label无关
  • 2AV、2RV、2AVP、2RVP与edge label无关
  • 2AE,删除edge label包含删除所有相关edges,AE会增加一个edge,应该分别锁edge label的write和read
  • 2RE,RE发生在edge label remove期间,多次删除edge不会有问题,如果edge label还在,正常进行;如果edge label不在了,则报异常edge label不存在,可接受
  • 2AEP,edge已经删除,AEP会在edge不存在的情况下,创建一个新的edge(append特性)
  • 2REP,删除edge property,如果不存在edge,也不报错;如果存在,则删除property,后续edge最终会被删除掉
  • 3AV(3AE),删除index label会删除所有index data,AV会增加该index label的索引信息,有冲突
  • 3RV,删除vertex,会删除对应的index信息,跟index label remove的删除虽然重复,不会有问题
  • 3AVP、3RVP、3AEP、3REP,AVP会改变index的propValues,删除旧的index(可能有占位符),增加新的index(可能有占位符),未删除index label元数据之前插入新index会成功,造成冲突,需要加锁
  • 3AE,删除index label会删除所有index data,AE会增加该index label的索引信息,有冲突
  • 3RE,删除edge,会删除对应的index信息,跟index label remove的删除虽然重复,不会有问题
  • 4AV、4AE,rebuild是对所有的存在vertex或edge重建索引,AV、AE本身会增加该vertex或edge的index,最终结果总是该vertex或edge构建好索引,不冲突
  • 4RV、4RE,会删除掉vertex或edge及其index信息,如果vertex或edge重建完了,则会全部删除,如果还没重建,则重建时已不存在,无冲突
  • 4AVP、4AEP、4RVP、4REP,会删除旧的index,增加新的index,rebuild的作用也是如此,不论vertex或edge的更新发生在rebuild哪个阶段都不会有不一致,无冲突
  • 1Q、2Q,索引和数据都在删除过程中,查询结果不能保证正确,可通过标识vertex label和edge label不允许查询
  • 3Q、4Q,索引处于不一致状态,数据都在,查询结果不正确

query

  • 通过vertex label、edge label和index label的锁,只能对包含label信息的的query进行锁定
  • 对于g.V()、g.E()、g.V(id)和g.E(id)无法进行锁定

目前仅对index label的query进行了上锁

锁的使用

格式为[LockGroup:Lock]
其中:

  • LockGroup有 vertexLabelRemove、edgeLabelRemove、indexLabelRemove、indexLabelRebuild
  • Lock为具体的vertexLabel、edgeLabel或indexLabel的name
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值