线程在多线程事务中能否看到彼此的变化?

Can threads see each other's changes in multi-threaded transactions?

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

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

多线程事务在同一范围内运行,但我想如果您没有配置 unique constraint on PropertyKeys.PATH. Doing so does mean that locking 启用,线程仍然可能会竞争,这可能会降低您的摄取速度,但会确保唯一性。

作为旁注,请考虑避免使用图表 API (graph.addVertex()) 并坚持使用纯 Gremlin - "get or create" 模式描述为