Многопотоковая транзакция JavaScript в Marklogic

Я хотел написать транзакцию с несколькими операторами в 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' из null из-за xdmp.rollback и не может увидеть значение в переменной 'result'

Может кто-нибудь, пожалуйста, исправить то, что идет не так в моем коде JavaScript на стороне сервера?

1 ответ

Как в SJS, так и в XQuery, подход к проверке результата транзакции состоит в том, чтобы оценить как транзакцию, так и проверку в операторах, которые отличаются от хореографического внешнего оператора.

(Синтаксис точки с запятой XQuery разделяет операторы, которые выполняются в разных транзакциях - эквивалент ряда уловок без хореографии внешнего оператора.)

Должно работать что-то похожее на следующее:

'use strict';
xdmp.eval(
    'declareUpdate(); xdmp.documentInsert("/docs/first.json",{"first": 1});',
    null,
    {isolation:'different-transaction'});
const doc = xdmp.eval(
    'cts.doc("/docs/first.json")',
    null,
    {isolation:'different-transaction'});
fn.exists(doc);

Тем не менее, нет необходимости проверять вставку документа. Если вставка не удалась, сервер выдает ошибку.

Также нет необходимости использовать другую транзакцию для чтения вставленного документа, чтобы вернуть его. Просто верните документ после вызова xdmp.insert().

Надеюсь, что это помогает,

Другие вопросы по тегам