线程可以看到彼此在多线程事务中的更改吗?

时间:2019-11-15 13:40:27

标签: tinkerpop3 janusgraph

我正在使用JanusGraph文档所述的multi-threaded transactions。我的每个线程都有助于构建目录树。在为特定目录插入新顶点之前,每个线程首先检查同一查询中是否已存在该顶点。如果找不到现有顶点,则仅用.orElseGet插入顶点。

Vertex vertex = graph.traversal().V()
    .hasLabel(VertexLabels.DIRECTORY)
    .has(PropertyKeys.PATH, directory.path())
    .tryNext()
    .orElseGet(() -> {
        return graph.addVertex(
            T.label, VertexLabels.DIRECTORY,
            PropertyKeys.PATH, directory.path());
    });

从技术上讲,这假定所有线程在同一事务范围内运行,则应防止重复。但是,我确实遇到重复。该文档似乎没有提供有关此问题的任何答案。您能否确认多线程事务是否在同一范围内运行?

1 个答案:

答案 0 :(得分:2)

多线程事务在相同的范围内运行,但是我想如果您没有在PropertyKeys.PATH上配置unique constraint,线程仍然有可能竞争。这样做确实意味着将启用locking,这可能会降低您的摄取速度,但会确保唯一性。

请注意,请避免使用Graph API(graph.addVertex())并坚持使用纯Gremlin-here描述了“获取或创建”模式。

相关问题