没有锁时会收到XDMP-LOCKED错误

Kem*_*gan 6 xquery marklogic marklogic-9

我有一个函数,我写了一个序列号的生成.功能如下:

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
            }
          )
};
Run Code Online (Sandbox Code Playgroud)

使用以下测试代码,qconsole窗口中的函数可以正常工作:

let res := util:generate-instrument-Id( 1 )
return fn:error( fn:QName("test", $res ) )
Run Code Online (Sandbox Code Playgroud)

即它在另一个事务上下文中执行并正确更新文档.但是,当我尝试从REST服务调用相同的函数时,它返回以下错误消息:

XDMP-LOCKED: xdmp:node-replace(fn:doc("/private/instrumentId-Sequence.xml")/instrument/@nextId, attribute{fn:QName("","nextId")}{"1228"}) -- Document or Directory is locked
Run Code Online (Sandbox Code Playgroud)

请注意,我从服务界面清理了所有其他代码以隔离问题并仍然收到相同的错误消息.

所以这是我的问题:

  • 在什么条件下发出此错误?
  • 我确信任何其他进程都没有锁定此文档(或它所在的目录),那么什么可能触发这种误报?
  • 由于它是从qconsole工作的,我假设如果我复制它在执行程序时所做的事情,我也可以解决这个问题.有关qconsole如何执行程序的任何文档?

非常感谢
K.

PS:我在Windows服务器上使用MarkLogic 9

Kem*_*gan 2

经过一番痛苦之后,我发现了我收到此错误的原因。看起来这是因为确实在目录“/”上放置了锁,并且该锁不是事务锁。

根据文档,它是由 WebDAV 服务器获取的持久锁。我实际上怀疑这可能与 webDAV 有关,并且我禁用了数据库上的 WebDAV 服务,假设这将释放这些服务将持有的任何锁,并且我能够无论如何,使用 qconsole 写入文档。

管理员帐户似乎有权忽略 webDAV 服务器创建的那些持久锁,以便该功能在该上下文中运行,并且禁用 webDAV 服务器不会释放它获取的持久锁。

因此,要解决该问题,我所要做的就是释放禁用 webDAV 服务器后悬而未决的锁。

之后,我重新启用了 webdav 服务器,该功能继续正常工作,这意味着 wevDAV 服务器仅在未记录的某些条件下获取锁定。

我想,我应该分享此信息以帮助可能遇到相同问题的其他人