了解服务器端JavaScript中的事务边界-Marklogic

时间:2018-11-09 15:06:41

标签: transactions marklogic serverside-javascript sjs

我想检查MarkLogic服务器端JavaScript中的事务边界。

所以我写了下面的代码。我只想在此事务中查看文档“ /docs/first.json”。基本上,我希望服务器端JavasSript内的每个语句都能看到事务内其他语句的更新,因此在事务外部不应该看到它。但是,当我运行以下代码时,我得到了文档“ /docs/first.json”,它是fn.doc("/docs/first.json")的结果,该文档在同一事务中运行。但是,当我打开一个新会话并尝试获取文档“ /docs/first.json”时,我知道该文档实际上已被吸收到数据库中,因此在事务外部也可见。

有人可以更正我在此代码中的错误之处,以便仅在交易内而不是交易外可以查看文档。我可以使用Xquery使用“ ;”作为语句分隔符来实现此目的。

declareUpdate({explicitCommit: true});
xdmp.eval('declareUpdate(); xdmp.documentInsert("/docs/first.json",{"first": 1});',{commit:'explicit',transactionMode:'update'})
xdmp.eval('fn.doc("/docs/first.json")',{transactionMode:"query"})

1 个答案:

答案 0 :(得分:1)

我认为问题在于显式的'declareUpdate()'覆盖了xdmp.eval选项,将其强制执行为自动提交。此外,您正在混合使用不推荐使用的不推荐使用的选项。不要将xdmp.eval()选项与prolog混合使用-正在进行事务提交。调用上述代码的方式也会对此产生影响。

请提供一个完整的示例,该示例不显示“提交”,并且不提及您如何调用以上代码或“打开新会话”的操作。