Я настоятельно рекомендую прочитать главу Руководства разработчика приложений Общие сведения о транзакциях в MarkLogic Server.
Заявления в MarkLogic являются запросами или обновлениями. Запросы происходят в определенное время и доступны только для чтения, что означает, что то, что они видят, стабильно. Из-за этого запросы не должны беспокоиться о блокировках записи. Обновления вносят изменения в базу данных. Для XQuery MarkLogic знает, что вы делаете, посредством статического анализа (для JavaScript вы должны вызвать declareUpdate()
). Если вы не уверены в том, что вы используете, вы можете позвонить xdmp:request-timestamp
; запрос даст вам значение, но обновление даст вам пустую последовательность.
Вы хотите сделать обновление и сделать эти изменения видимыми для более позднего запроса SPARQL. Есть два возможных способа, в зависимости от того, является ли родительский запрос запросом или обновлением.
В любом случае вы на правильном пути, чтобы ваш sem:sparql-update
звонок был в другой транзакции.
Родитель является обновлением
Если родительский запрос является обновлением, тогда будет виден запрос, сделанный после sparql-update отдельной транзакции. Вам не нужно будет делать ничего особенного, кроме как убедиться, что ваше чтение приходит после sparql-обновления.
Родитель - это запрос
Если родительский запрос является запросом, он выполняется с установленной отметкой времени и не увидит результаты обновления sparql. В этом случае вы также захотите запустить sem:sparql
как отдельную транзакцию, которая позволит ему увидеть результаты уже завершенной транзакции обновления.
Обратите внимание, что если родитель является запросом, технически он будет делать обновлением, но вряд ли это будет хороший план. В этом случае весь родительский запрос будет беспокоиться о большем количестве блокировок.