Многозадачная транзакция JavaScript в Marklogic - PullRequest
0 голосов
/ 13 ноября 2018

Я хотел написать транзакцию с несколькими операторами в 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-коде?

1 Ответ

0 голосов
/ 13 ноября 2018

Как в 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 ().

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

...