Marklogic中的JavaScript多语句事务



我想在marklogic中用服务器端JavaScript编写一个多语句事务。我想要实现的是,做一个更新事务,然后写一个查询语句,查询更新后的文档,确认更新在事务中可见,最后进行回滚。通过执行回滚,我想确认在事务内进行的更新在事务外不可见,而在事务内可见。为了使用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:由于xdmp.rollback,无法读取null的属性'result',并且无法在变量'result'中看到值

有人能纠正我的服务器端javascript代码中的错误吗?

在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((调用后返回文档即可。

希望有帮助,

相关内容

  • 没有找到相关文章