在Marklogic JavaScript的多语句事务(JavaScript Multi-state

2019-10-29 08:42发布

我想写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的]类型错误:不能因xdmp.rollback并不能为空的读取属性“结果”看到变量“结果”的价值

可有人请更正一下,在我的服务器端JavaScript代码的问题呢?

Answer 1:

在这两个SJS和XQuery的方法来检查交易的结果是既EVAL交易和是从编舞外部语句不同的语句检查。

(XQuery的分号分隔语法,在不同的交易执行语句 - 没有编排外声明一系列evals的等效)

一些类似于以下应该工作:

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

希望帮助,



文章来源: JavaScript Multi-statement Transaction in Marklogic