В marklogic 9 как сделать обновления видимыми в той же транзакции? - PullRequest
0 голосов
/ 27 июня 2019

В marklogic 9 у меня есть расширение службы ресурсов, написанное на xquery.Это конечная точка «delete», поэтому режим транзакции «update».Я делаю что-то похожее на:

(: search for objects that have /a/id = $theId :)
let $objs := cts:search(fn:doc(), cts:path-range-query('/a/id', $theId)
(: log the number of results :)
let $_ := xdmp:log(fn:count($objs))

(: for each of the objects, remove the /a/id node :)
let $_ := for ($obj in $objs) xdmp:node-delete($obj/a/id)

(: search for objects that have /a/id = $theId :)
let $objs2 := cts:search(fn:doc(), cts:path-range-query('/a/id', $theId)
(: log the number of results :)
let $_ := xdmp:log(fn:count($objs2))

Мое первое ожидание состояло в том, что зарегистрированные значения будут отличаться: первое будет количеством результатов поиска, а второе всегда будет нулевым, так как яудалил узел '/ a / id' из каждого результата.Но оба записанных значения всегда одинаковы.т.е. изменения, сделанные в транзакции, не видны в расширении.

Я прочитал в https://docs.marklogic.com/guide/app-dev/transactions#id_85012, что updates are not visible within the updating statement, поэтому я попытался заставить расширение службы ресурсов вести себя как мульти-операторобновление без удачи.Я также пытался явно вызвать let $_ := xdmp:commit() перед вторым поиском, опять же безуспешно.

Возможно ли иметь желаемое поведение в расширении службы ресурсов xquery?

1 Ответ

2 голосов
/ 27 июня 2019

MarkLogic полностью ACID, так как вы правильно определили, что документ не будет обновлен в базе данных до завершения транзакции обновления.Таким образом, во время выполнения второго вызова cts: search вы еще не увидите обновленный документ, отраженный в результатах, потому что ваша транзакция обновления еще не завершена.

Моя рекомендация обычно состоит в том, чтобы отвлечь людей отпытаясь вскипятить океан в одной транзакции или расширении REST, а скорее разбить вещи там, где это имеет смысл.В вашем случае я бы рекомендовал сделать одно расширение REST для подсчета или иного чтения данных и одно расширение REST для обновления удаления вашего узла.Скорее всего, вы могли бы даже использовать / v1 / search вместо написания расширения для подсчета документов.

Вы можете выполнить несколько транзакций в одном расширении REST, если вы используете функции, такие как xdmp: eval или xdmp: invoke toСделай так.Тем не менее, я нахожу, что это обычно затрудняет сопровождение и отладку кода при его разработке таким образом.Также могут быть недостатки производительности при использовании этих функций без необходимости.

...