在Marklogic中获取XDMP-CONFLICTINGUPDATES异常

时间:2013-03-21 07:15:51

标签: marklogic

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

    (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))})
      };

很少与多语句事务的事务规则混淆。由于文档上的锁定已经释放。为什么在对它进行节点替换时有任何问题?

1 个答案:

答案 0 :(得分:1)

由于语法错误,示例代码将无法按原样运行:缺少变量,并且在表达式主体之后有一个函数。但是看过去,没有什么可以建议多语句交易。相反,这看起来像一个语句,因此$uri的多个更新相互冲突。对dls:document-update更新$uri然后dls:document-checkin的调用会尝试更新同一事务中的同一文档,从而导致冲突。同样的逻辑适用于$sub-uri。在文档中,http://docs.marklogic.com/dls:document-update注意到“此函数必须在与dls不同的事务中调用:document-checkout和dls:document-checkin”。

MarkLogic事务的行为与您预期的不同,因为XQuery不是命令式或过程式语言。尝试阅读http://docs.marklogic.com/guide/app-dev/transactions

上的交易

在大多数情况下,我更喜欢将单独的事务编写为单独的请求,但这是查询的第一部分,使用分号来分隔事务。您可以尝试以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())