Я хотел написать транзакцию с несколькими операторами в JavaScript на стороне сервера в marklogic. Чего я хотел добиться, так это выполнить транзакцию обновления, а затем написать оператор запроса, который запрашивает обновленный документ и подтверждает, что обновление видно внутри транзакции, и, наконец, выполнить откат. Выполнив откат, я хотел подтвердить, что обновление, выполненное в транзакции, не видно за пределами транзакции, и оно видно внутри транзакции.
Я написал код как для Xquery, так и для серверного JavaScript-кода, чтобы добиться этого, используя xdmp: eval / xdmp.eval. Я смог успешно добиться этого с помощью Xquery, но не в Javascript на стороне сервера.
Ниже приведен мой код Xquery:
xquery version "1.0-ml";
declare option xdmp:transaction-mode "update";
let $query :=
'xquery version "1.0-ml";
xdmp:document-insert("/docs/first.json", <myData/>)
'
return xdmp:eval(
$query, (),
<options xmlns="xdmp:eval">
<isolation>same-statement</isolation>
</options>);
if (fn:doc("/docs/first.json"))
then ("VISIBLE")
else ("NOT VISIBLE");
xdmp:rollback()
Ниже мой серверный код JavaScript:
declareUpdate();
var query = 'declareUpdate(); xdmp.documentInsert("/docs/first.json",{"first": 1}); '
xdmp.eval(query,null,{isolation:'same-statement'})
fn.doc("/docs/first.json")
if (fn.doc("/docs/first.json"))
var result = ("visible")
else var result = ("not visible");
xdmp.rollback()
result
Я выполняю оба этих кода через консоль запросов. Я ожидаю увидеть результат "видимым" в обоих случаях. Но при запуске серверного кода JavaScript он выдает ошибку: [javascript] TypeError: Невозможно прочитать свойство 'result' с нулевым значением из-за xdmp.rollback и не может увидеть значение в переменной 'result'
Может кто-нибудь исправить ошибки в моем серверном JavaScript-коде?