搭配Cassandra使用的JanusGraph中唯一约束为何会删除已有数据?
问题根因
这是JanusGraph 0.6.x 配合 Cassandra 4.0 使用时的已知内核缺陷,出现在唯一约束冲突后的事务回滚逻辑中。
触发逻辑说明
JanusGraph的分布式唯一约束实现逻辑如下:
- 写入带唯一属性的顶点时,会先对目标属性值加分布式锁,先写入临时顶点数据,再校验是否存在重复属性
- 校验到重复触发约束报错时,理论上仅回滚本次事务写入的临时数据,保留原有合法数据
- Cassandra 4.0适配的JanusGraph 0.6.x版本回滚逻辑存在错误,触发冲突后会误删除原有合法顶点对应的二级索引条目,而非仅清理临时数据:原有顶点的实际存储数据并未丢失,但索引被删除后,通过属性查询的语句
g.V().has('name',"myname")无法匹配到结果,你可以通过原有顶点ID直接查询g.V(你的原有顶点ID)验证数据还存在。
修复方案
- 优先选择升级JanusGraph到0.6.4及以上版本,该版本已经正式修复了Cassandra 4.x下唯一约束回滚误删索引的问题
- 若暂时无法升级,可在应用层做写入前校验:同一个事务内先查询目标属性是否存在,确认不存在再执行写入操作,降低冲突概率;已经出现查询失效的顶点,可重建对应属性的索引恢复查询能力
- 业务允许的前提下,也可以将唯一校验逻辑完全放到应用层实现,规避内核层面的缺陷
内容的提问来源于stack exchange,提问作者Sumit Kumar
相关产品推荐
相关产品推荐

