获取Marklogic中的XDMP-ConflictUpdates异常

获取Marklogic中的XDMP-ConflictUpdates异常,marklogic,Marklogic,尝试执行以下语句时获取XDMP-conflictinupdates: (dls:document-update($uri,$content,"Main Document Updated",fn:true(),xdmp:default-permissions(),$content-collection), dls:document-checkin($uri, fn:true()), dls:document-update($sub-uri,$sub-content,"

尝试执行以下语句时获取
XDMP-conflictinupdates

    (dls:document-update($uri,$content,"Main Document Updated",fn:true(),xdmp:default-permissions(),$content-collection), 
     dls:document-checkin($uri, fn:true()),
     dls:document-update($sub-uri,$sub-content,"sub Document Updated",fn:true(),xdmp:default-permissions(),$content-sub-collection),
     dls:document-checkin($sub-uri, fn:true()),
     cin:update-version ($sub-uri))

     declare function cin:update-version ($sub-uri){
      let $id := xs:int(fn:doc($sub-uri)//id)
      return
       xdmp:node-replace(fn:doc($sub-uri)//id,element id {fn:sum(($id,1))})
      };

对多语句事务的事务规则几乎没有混淆。因为文档上的锁已被释放。为什么它在执行节点替换时会有任何问题

由于语法错误,示例代码无法按编写的方式运行:缺少变量,并且表达式体后面有一个函数。但是,从这个角度来看,这里没有什么可以建议多语句交易。相反,这看起来像一条语句,因此对
$uri
的多个更新相互冲突。调用
dls:document update
更新
$uri
,然后
dls:document checkin
尝试在同一事务中更新同一文档,导致冲突。同样的逻辑也适用于
$sub-uri
。在文档中,注意“此功能必须在与dls:document checkout和dls:document checkin分开的事务中调用”

MarkLogic事务的行为可能与您预期的不同,因为XQuery不是命令式或过程式语言。请尝试在以下位置阅读交易记录:

在大多数情况下,我更喜欢将单独的事务作为单独的请求来编写,但这里是使用分号来分隔事务的查询的第一部分。您可以尝试用
xdmp:commit
样式重写相同的代码,以了解差异

(: multiple statements with semicolons :)
(: statement 1 :)
import module namespace dls="http://marklogic.com/xdmp/dls"
 at "/MarkLogic/dls.xqy";

declare variable $content := <test>content</test>;
declare variable $content-collection := "content";
declare variable $uri := "test";

dls:document-update(
  $uri,
  $content,
  "Main Document Updated",
  fn:true(),
  xdmp:default-permissions(),
  $content-collection) ;

(: statement 2 :)
import module namespace dls="http://marklogic.com/xdmp/dls"
 at "/MarkLogic/dls.xqy";

declare variable $uri := "test";

dls:document-checkin($uri, fn:true()) 
(:带分号的多个语句:)
(:报表1:)
导入模块命名空间dls=”http://marklogic.com/xdmp/dls"
位于“/MarkLogic/dls.xqy”;
声明变量$content:=content;
声明变量$content集合:=“content”;
声明变量$uri:=“test”;
文件更新(
$uri,
$content,
“主要文件更新”,
fn:true(),
xdmp:default-permissions(),
$content-collection);
(:报表2:)
导入模块命名空间dls=”http://marklogic.com/xdmp/dls"
位于“/MarkLogic/dls.xqy”;
声明变量$uri:=“test”;
dls:documentcheckin($uri,fn:true())

在同一个xquery中,所有变量都在此之前设置。我只是粘贴了有问题的代码片段。dls:在单独的事务中单独调用文档签出。前四条语句,即uri和sub-uri的update和chekin,运行良好。当在子uri上只引入了xdmp:node replace操作时,出现了问题。那么,这不是同一事务下多个语句的问题吗?唯一的解决方案是将dls:document update、dls:document checkin和xdmp:node replace分离到单独的事务中?不确定我还可以添加什么。您有一条更新冲突的语句。您可以尝试对其进行返工以消除冲突,也可以使用多语句事务。如果你去MST,我认为
xdmp:commit
比分号好。