尝试执行以下语句时获取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))})
};
很少与多语句事务的事务规则混淆。由于文档上的锁定已经释放。为什么在对它进行节点替换时有任何问题?
答案 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())