Marklogic 中的 JavaScript 多语句事务

标签 javascript transactions marklogic serverside-javascript acid-state

我想在 marklogic 中的服务器端 JavaScript 中编写多语句事务。我想要实现的是,执行更新事务,然后编写查询语句来查询更新的文档并确认更新在事务中可见,最后进行回滚。通过进行回滚,我想确认事务内进行的更新在事务外不可见,而在事务内可见。 我在 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: Cannot read property 'result' of null due to xdmp.rollback and notable see the value in variable 'result'

有人可以纠正我的服务器端 JavaScript 代码中出现的问题吗?

最佳答案

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

希望有帮助,

关于Marklogic 中的 JavaScript 多语句事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53282962/

相关文章:

java - 如何将文档 uri 和数据库名称传递给 marklogic spark 连接器?

javascript - 在谷歌表格脚本中连接两列

javascript - 调用 addEventListener 数百次

sql - 我可以使用 SQL Server 打开可停止事务吗?

Marklogic 在托管文档上使用 xPath 会生成该文档的所有版本

node.js - Marklogic 8 nodejs queryBuilder.orderBy SEARCH-BADORDERBY

javascript - django 中的 recaptcha 刷新按钮

javascript - 带有 angular2 和 grunt 错误 TS2304 : Cannot find name 的 typescript

java - 未提交的数据库事务和自增列

spring - 在实际运行环境(例如Netflix Inc.)中使用什么技术来解决分布式事务?