Тестирование транзакций XQuery и Marklogic

У нас есть некоторые бизнес-требования, которые требуют управления версиями. Для этого мы решили использовать библиотечные сервисы MarkLogic. У нас возникла проблема с тестированием нашего кода с помощью XRAY и использованием транзакций.

Наш тест выглядит следующим образом:

declare function should-save-with-version-when-releasing() {
declare option xdmp:transaction-mode "update";

    let $uri := '/some-document-uri.xml'         
    let $document := fn:doc($uri) 
    let $pre-release-version := c:get-latest-version($uri)
    let $post-release-version := c:get-latest-version($uri)
    let $result := mut:release($document) (:this should version up:)

    return (assert:not-empty($pre-release-version), 
            assert:not-empty($result), 
            assert:not-equal($pre-release-version,$post-release-version),
            xdmp:rollback())

Тест пройдёт несмотря ни на что, и как оказывается откат ML сносит все переменные.

Как мы можем проверить это с помощью транзакций?

Любая помощь очень ценится,

im


person Irina Muchnik    schedule 24.12.2012    source источник


Ответы (1)


В MarkLogic полное обновление XQuery обычно действует как одна транзакция. Когда mut:release добавляет обновление в стек транзакции, остальная часть запроса не увидит это обновление до тех пор, пока оно не будет зафиксировано. С точки зрения запроса это обычно происходит после завершения всего запроса и не отображается для запроса.

В документации есть что добавить о том, что http://docs.marklogic.com/xdmp:rollback делает:

Когда транзакция откатывается, текущий оператор немедленно завершается, обновления, сделанные любым оператором в транзакции, отбрасываются, и транзакция завершается.

Так что дело не в том, что переменные уничтожены: дело в том, что ваша программа закончилась.

Я думаю, http://docs.marklogic.com/guide/app-dev/transactions#id_15746 есть пример, который довольно близок к вашему варианту использования: «Пример: транзакции с несколькими операторами и изоляция с одним оператором». В нем показано, как xdmp:eval или xdmp:invoke обновить документ и просмотреть результаты в рамках одного запроса.

Проверьте, работает ли он, затем замените xdmp:commit на xdmp:rollback. Для меня пример все еще работает. Начните заменять остальную логику логикой вашего модульного теста, и вы должны быть в пути.

person mblakele    schedule 24.12.2012