サーバーサイド 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 コードで何が問題になっているのか、誰かが修正してもらえますか?