我有一个函数,我写了一个序列号的生成。功能如下:
declare function generate-instrument-Id( $cnt as xs:int? )
as xs:int {
let $count := if( $cnt and $cnt > 0 ) then $cnt else 1
let $url := '/private/instrumentId-Sequence.xml'
(: this redirection is needed to write id in another
transaction context :)
return xdmp:invoke-function( function() {
let $id := fn:doc( $url )/instrument/@nextId
let $_ := xdmp:node-replace( $id
, attribute nextId { $id + $count } )
return $id
}
)
};
使用以下测试代码从qconsole窗口中正常运行该函数:
let res := util:generate-instrument-Id( 1 )
return fn:error( fn:QName("test", $res ) )
即。它在另一个事务上下文中执行并正确更新文档。但是,当我尝试从REST服务调用相同的函数时,它返回以下错误消息:
XDMP-LOCKED: xdmp:node-replace(fn:doc("/private/instrumentId-Sequence.xml")/instrument/@nextId, attribute{fn:QName("","nextId")}{"1228"}) -- Document or Directory is locked
请注意,我从服务界面清理了所有其他代码以隔离问题并仍然收到相同的错误消息。
所以这是我的问题:
非常感谢
ķ。
PS:我在Windows服务器上使用MarkLogic 9
答案 0 :(得分:2)
根据documentation,它是WebDAV服务器获取的持久锁。我实际上怀疑它可能与webDAV有关,我在数据库上禁用了WebDAV服务,假设它会释放任何锁定那些服务将保持不变,无论如何我都可以使用qconsole写入doc。
管理员帐户似乎有权忽略webDAV服务器创建的持久锁,以便该功能从该上下文工作,并且禁用webDAV服务器不会释放它获取的持久锁。
因此,解决问题的所有方法就是在禁用webDAV服务器后释放挂起的锁。
之后,我重新启用了webdav服务器并且该功能继续正常工作,这意味着wevDAV服务器仅在某些未记录的条件下获取锁定。
我想,我应该分享这些信息,以帮助可能会遇到同样问题的其他人