В чем разница между graph.tx () и graph.newTransaction ()? - PullRequest
0 голосов
/ 15 июня 2019

Я использую GraphTraversalSource для обновления вершины и ребра. После пользовательской логики я пытаюсь зафиксировать свое изменение на сервере.

Когда я использую graph.tx().commit(), изменение может быть обновлено в графике. Но когда я использую graph.newTransaction().commit(), я не мог видеть изменения в графике.

Так в чем же разница этих двух методов для фиксации изменения?

1 Ответ

0 голосов
/ 16 июня 2019

Похоже, что вы спрашиваете о трех разных вещах на самом деле:

  1. GraphTraversalSource.tx().commit()
  2. Graph.tx().commit()
  3. Graph.tx().createThreadedTx() - что я считаюэто то, что вы подразумеваете под newTransaction()

GraphTraversalSource.tx().commit() - это просто прокси для базового Graph за GraphTraversalSource, таким образом вызывая Graph.tx().commit().Оба могут использоваться взаимозаменяемо для фиксации транзакции, связанной с текущим потоком.Конечно, рекомендуется, чтобы вы взаимодействовали со своим графом только с помощью GraphTraversalSource, поэтому вы, скорее всего, назовете commit() для этого класса.Стоит отметить, что если вы не используете встроенный режим или не отправляете на Gremlin Server сценарии, которые явно не управляются транзакциями , нет необходимости когда-либо вызывать commit(), поскольку ваши транзакции будут выполняться автоматическисовершено для вас за обход.

Что касается третьего элемента, указанного выше, createThreadedTx() предоставляет способ выполнения потоковых транзакций - ссылка на документацию JanusGraph для этого здесь .Ценность многопоточных транзакций заключается в способности работать в одной и той же транзакции в нескольких потоках (альтернатива упоминалась выше, когда транзакции по умолчанию связаны с тем потоком, в котором они находятся).Я полагаю, вы ссылались на newTransaction(), потому что он упоминается в документации JanusGraph.Я полагаю, что этот метод представляет собой собственный API JanusGraph для выполнения многопоточных транзакций и, вероятно, является базовым методом, вызываемым из TinkerPop createThreadedTx().Поэтому, если вам нужен более переносимый код, вы бы предпочли createThreadedTx(), хотя я не верю, что многие провайдеры графов поддерживают эту функцию.

Возможно, ответ на ваш вопрос о том, что вы видели, теперь очевиден, но если нет, то относительно:

Когда я использую graph.tx (). Commit () изменение может быть обновлено в графике.Но когда я использую graph.newTransaction (). Commit (), я не смог увидеть изменения в графе.

обратите внимание, что изменение в графе и последующий вызов g.tx().commit() просто передадут эти мутации в граф,Вы внесли изменения в текущий поток и зафиксировали их, и новая транзакция была автоматически запущена в этом потоке.

Теперь, допустим, вы внесли некоторые изменения и используете graph.tx().createThreadedTx().commit().Ну, вы не вызвали commit() для транзакции в текущем потоке.Вы создали отдельную многопоточную транзакцию, не внесли в нее никаких изменений в графике и сразу же зафиксировали ее закрытие.

...