graph.tx()和graph.newTransaction()有什么区别?

时间:2019-06-15 10:34:54

标签: gremlin tinkerpop3 janusgraph

我正在使用GraphTraversalSource更新顶点和边。根据用户逻辑,我尝试将更改提交到服务器。

当我使用graph.tx().commit()时,更改可以更新到图形中。但是当我使用graph.newTransaction().commit()时,看不到图形的变化。

那么这两种提交更改的方法有什么区别?

1 个答案:

答案 0 :(得分:0)

您似乎实际上是在问三件事:

  1. GraphTraversalSource.tx().commit()
  2. Graph.tx().commit()
  3. Graph.tx().createThreadedTx()-我相信您所说的newTransaction()

GraphTraversalSource.tx().commit()只是Graph之后的基础GraphTraversalSource的代理,因此称为Graph.tx().commit()。两者可以互换使用,以提交绑定到当前线程的事务。当然,建议您仅通过GraphTraversalSource与图形进行交互,因此您可能会在该类上调用commit()。值得注意的是,除非您进入embedded mode或将脚本明确发送给not transaction managed到Gremlin Server,否则就无需调用commit(),因为每次遍历您的交易都会自动提交给您

对于上面列出的第三项,createThreadedTx()提供了一种进行threaded transactions的方法-指向JanusGraph文档的链接为here。线程事务的价值在于能够跨多个线程在同一个事务中工作(上面提到了另一种选择,默认情况下,事务绑定到它们所在的线程)。我想您引用了newTransaction(),因为它似乎在JanusGraph文档中被提及。我相信该方法代表用于执行多线程事务的本机JanusGraph API,并且可能是TinkerPop的createThreadedTx()调用的基础方法。因此,如果您需要更多可移植的代码,则最好使用createThreadedTx(),尽管我认为许多图形提供程序都不支持此功能。

也许关于您所看到的东西的问题的答案现在已经很明显了,但如果没有,关于以下内容:

  

当我使用graph.tx()。commit()时,更改可以更新到图中。但是当我使用graph.newTransaction()。commit()时,我看不到图形的变化。

请注意,先变异图然后调用g.tx().commit(),即可将这些变异提交至图。您在当前线程中进行了更改并提交了更改,并且该线程中自动启动了新事务。

现在,假设您进行了一些更改并使用了graph.tx().createThreadedTx().commit()。好吧,您没有在当前线程中的事务上调用commit()。您创建了一个单独的多线程事务,其中的图没有任何变化,然后立即将其关闭。