线程在多线程事务中能否看到彼此的变化?
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" 模式描述为 。
我正在使用 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" 模式描述为