锁的使用场景分析
概述
对存在冲突的操作,使用读写锁进行同步,耗时操作抓取 Write Lock,短时操作抓取 Read Lock
目前仅用于耗时较长的容易出现数据不一致问题的场景,如index remove、index rebuild、vertex label remove和edge label remove
场景描述
vertex label remove
- 检查是否有包含该vertex label的edge label,有则报错;无则继续
- 删除vertex label相关的所有index data
- 删除vertex label相关的所有的vertices
- 删除vertex label元数据
edge label remove
- 删除edge label相关的所有index data
- 删除edge label相关的edges
- 删除edge label元数据
index label remove
- 删除所有indexLabel的index data
- 删除vertex label或edge label中的indexNames
- 删除index label元数据
index label rebuild
- 删除index label的index data
- 根据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 lock | AV | RV | AVP | RVP | AE | RE | AEP | REP | Q | |
---|---|---|---|---|---|---|---|---|---|---|
1 | vertex label remove | Y | N | Y | N | N | N | N | N | Y |
2 | edge label remove | N | N | N | N | Y | N | Y | N | Y |
3 | index label remove | Y | N | Y | Y | Y | N | Y | Y | Y |
4 | index label rebuild | N | N | N | N | N | N | N | N | Y |
纵向1-4为耗时较长的复杂操作,需要加 Write Lock;横向为简单CRUD,如果有冲突需要加 Read Lock
根据上述流程,可知锁的范围为:
包含 | |
---|---|
vertex label remove | index label remove |
edge label remove | index 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