【问题标题】:Can threads see each other's changes in multi-threaded transactions?多线程事务中线程可以看到彼此的变化吗?
【发布时间】:2020-03-11 16:19:14
【问题描述】:

如 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());
    });

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

【问题讨论】:

    标签: tinkerpop3 janusgraph


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-08
      • 1970-01-01
      • 1970-01-01
      • 2019-02-11
      相关资源
      最近更新 更多