0

サーバーサイド JavaScript で複数ステートメントのトランザクションを marklogic で書きたいと思っていました。私が達成したかったのは、更新トランザクションを実行してから、更新されたドキュメントを照会するクエリ ステートメントを記述し、トランザクション内で更新が表示されることを確認し、最後にロールバックを実行することです。ロールバックを行うことで、トランザクション内で行われた更新がトランザクションの外では見えず、トランザクション内で見えることを確認したかったのです。xdmp:eval/xdmp.eval を使用してこれを実現するために、Xquery とサーバーサイド JavaScript の両方でコードを作成しました。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: Cannot read property 'result' of null due to xdmp.rollback and not can see the value in variable 'result'

サーバー側の JavaScript コードで何が問題になっているのか、誰かが修正してもらえますか?

4

1 に答える 1

2

SJS と XQuery の両方で、トランザクションの結果を検査するアプローチは、コレオグラフィーの外側のステートメントとは異なるステートメントでトランザクションと検査の両方を評価することです。

(XQuery のセミコロン構文は、異なるトランザクションで実行されるステートメントを区切ります。これは、コレオグラフィーの外側のステートメントがない一連の eval に相当します。)

次のようなものが機能するはずです。

'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() 呼び出しの後にドキュメントを返すだけです。

それが役立つことを願って、

于 2018-11-13T16:31:51.320 に答える