Удаление троек в разных транзакциях в MarkLogic - PullRequest
0 голосов
/ 06 июля 2018

Я использую MarkLogic 8

Я должен удалить тройки, используя sem:sparql-update в первом операторе, и не хочу получать такие же удаленные тройки в следующем операторе, используя sem:sparql.

Я пытался передать sem:sparql-update в xdmp:invoke-function, но это не работает.

В sem:sparql-update сказано, что изоляцией по умолчанию будет «другая транзакция». Если это так, я считаю, что я не должен получать удаленные тройки в немедленном утверждении sem:sparql-update.

Пожалуйста, помогите!

Ответы [ 2 ]

0 голосов
/ 06 июля 2018

Я настоятельно рекомендую прочитать главу Руководства разработчика приложений Общие сведения о транзакциях в MarkLogic Server.

Заявления в MarkLogic являются запросами или обновлениями. Запросы происходят в определенное время и доступны только для чтения, что означает, что то, что они видят, стабильно. Из-за этого запросы не должны беспокоиться о блокировках записи. Обновления вносят изменения в базу данных. Для XQuery MarkLogic знает, что вы делаете, посредством статического анализа (для JavaScript вы должны вызвать declareUpdate()). Если вы не уверены в том, что вы используете, вы можете позвонить xdmp:request-timestamp; запрос даст вам значение, но обновление даст вам пустую последовательность.

Вы хотите сделать обновление и сделать эти изменения видимыми для более позднего запроса SPARQL. Есть два возможных способа, в зависимости от того, является ли родительский запрос запросом или обновлением.

В любом случае вы на правильном пути, чтобы ваш sem:sparql-update звонок был в другой транзакции.

Родитель является обновлением

Если родительский запрос является обновлением, тогда будет виден запрос, сделанный после sparql-update отдельной транзакции. Вам не нужно будет делать ничего особенного, кроме как убедиться, что ваше чтение приходит после sparql-обновления.

Родитель - это запрос

Если родительский запрос является запросом, он выполняется с установленной отметкой времени и не увидит результаты обновления sparql. В этом случае вы также захотите запустить sem:sparql как отдельную транзакцию, которая позволит ему увидеть результаты уже завершенной транзакции обновления.

Обратите внимание, что если родитель является запросом, технически он будет делать обновлением, но вряд ли это будет хороший план. В этом случае весь родительский запрос будет беспокоиться о большем количестве блокировок.

0 голосов
/ 06 июля 2018

Вам нужно запустить как sem:sparql-update, так и sem:sparql в different-transactions. В противном случае sem: sparql будет работать с отметкой времени запроса, который вызывает обновление, которое предшествует самим обновлениям, поэтому он никогда не сможет увидеть обновления.

Это часть методологии MVCC, которую MarkLogic использует для обработки транзакций.

НТН!

...