简要总结
使用最新的 Titan-0.5 快照。我们的代码在并发线程中创建顶点。我们最终会处于一个状态,即我们有多个具有相同键的顶点。由于我们的限制,我们预计这不会发生。
使用以下配置键:
PropertyKey name = management.makePropertyKey(keyName)
.dataType(String.class)
.cardinality(Cardinality.SINGLE)
.make();
TitanGraphIndex nameIndex = management.buildIndex(keyName, Vertex.class)
.indexKey(name)
.unique()
.buildCompositeIndex();
management.setConsistency(nameIndex, ConsistencyModifier.LOCK);
全文
我们有一个配置有唯一顶点属性键的 Titan DB。在并发线程中写入数据库时,我们发现 Titan 使用相同的键持久化多个顶点。
我已将问题提炼为一个测试文件: https ://gist.github.com/ubit-ee/8520304273cd2024af29 这是针对 0.5 分支的最新版本构建的。
该代码生成三个线程,它们通过倒计时锁存器同步以同时启动(尽可能多地)。然后线程: 使用键“KEY_VALUE_A”创建顶点 使用键“KEY_VALUE_B”创建顶点 在两者之间创建一个标签 如果线程要按顺序运行,则可能会因重复键而出现异常。我已经能够强迫这个案子了。
当线程并发运行时,我希望至少有一个线程成功并且任何数量都失败。无论如何,我希望图的最终状态是两个顶点和两者之间的一条边。
不幸的是,当我运行它时,数据库反复处于具有超过 2 个顶点和边的状态。存在具有重复键的顶点。测试将图形转储到 XML。示例: https ://gist.github.com/ubit-ee/d5530e4fa4b87c752294
为 berkeleydb 配置的测试代码,但我也针对 Cassandra 重复了这个问题。
问题
- 我是否正确配置了模式,使得顶点键应该是唯一的?
- 我应该对交易做任何不同的事情吗?
- 我是否误解了泰坦的预期行为?