0

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

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

4

1 回答 1

2

由于语法错误,示例代码不会按所写的方式运行:缺少变量并且表达式主体后面有一个函数。但回顾过去,这里没有什么可以建议多语句交易。相反,这看起来像一个语句,因此多个更新$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()) 
于 2013-03-21T15:28:52.763 回答