不存在锁时收到 XDMP-LOCKED 错误
Receive XDMP-LOCKED error when no locks exist
我编写了一个用于生成序号的函数。函数如下:
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 window 使用以下测试代码时工作正常:
let res := util:generate-instrument-Id( 1 )
return fn:error( fn:QName("test", $res ) )
即它在另一个事务上下文中执行并正确更新文档。但是,当我尝试从 REST 服务调用相同的函数时,returns 出现以下错误消息:
XDMP-LOCKED: xdmp:node-replace(fn:doc("/private/instrumentId-Sequence.xml")/instrument/@nextId, attribute{fn:QName("","nextId")}{"1228"}) -- Document or Directory is locked
请注意,我清理了服务接口中的所有其他代码以隔离问题,但仍然收到相同的错误消息。
所以这是我的问题:
- 在什么情况下发出此错误?
- 我确定没有任何其他进程对该文档(或它所在的目录)持有任何锁,那么什么可能触发这样的误报?
- 因为它在 qconsole 上工作,我假设如果我复制它在执行程序时所做的事情,我也可以解决这个问题。有关于 qconsole 如何执行程序的文档吗?
非常感谢
K.
PS:我在 windows 服务器上使用 MarkLogic 9
经过一番痛苦之后,我发现了我收到此错误的原因。看来这是因为确实在目录“/”上放置了一个锁,而且这个锁不是事务锁。
根据documentation,它是由 WebDAV 获取的持久锁 server.I 实际上怀疑这可能与 webDAV 有关,我禁用了数据库上的 WebDAV 服务,假设这会释放那些服务持有的任何锁,我仍然可以使用 qconsole 写入文档。
管理员帐户似乎有权忽略由 webDAV 服务器创建的那些持久锁,以便该功能在该上下文中工作,并且禁用 webDAV 服务器不会释放它获得的持久锁。
所以,为了解决这个问题,我所要做的就是释放在我禁用 webDAV 服务器后挂起的锁。
之后,我重新启用了 webdav 服务器,该功能继续正常工作,这意味着 wevDAV 服务器仅在未记录的特定条件下获取锁。
我想,我应该分享此信息以帮助可能遇到相同问题的其他人
我编写了一个用于生成序号的函数。函数如下:
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 window 使用以下测试代码时工作正常:
let res := util:generate-instrument-Id( 1 )
return fn:error( fn:QName("test", $res ) )
即它在另一个事务上下文中执行并正确更新文档。但是,当我尝试从 REST 服务调用相同的函数时,returns 出现以下错误消息:
XDMP-LOCKED: xdmp:node-replace(fn:doc("/private/instrumentId-Sequence.xml")/instrument/@nextId, attribute{fn:QName("","nextId")}{"1228"}) -- Document or Directory is locked
请注意,我清理了服务接口中的所有其他代码以隔离问题,但仍然收到相同的错误消息。
所以这是我的问题:
- 在什么情况下发出此错误?
- 我确定没有任何其他进程对该文档(或它所在的目录)持有任何锁,那么什么可能触发这样的误报?
- 因为它在 qconsole 上工作,我假设如果我复制它在执行程序时所做的事情,我也可以解决这个问题。有关于 qconsole 如何执行程序的文档吗?
非常感谢
K.
PS:我在 windows 服务器上使用 MarkLogic 9
经过一番痛苦之后,我发现了我收到此错误的原因。看来这是因为确实在目录“/”上放置了一个锁,而且这个锁不是事务锁。
根据documentation,它是由 WebDAV 获取的持久锁 server.I 实际上怀疑这可能与 webDAV 有关,我禁用了数据库上的 WebDAV 服务,假设这会释放那些服务持有的任何锁,我仍然可以使用 qconsole 写入文档。
管理员帐户似乎有权忽略由 webDAV 服务器创建的那些持久锁,以便该功能在该上下文中工作,并且禁用 webDAV 服务器不会释放它获得的持久锁。
所以,为了解决这个问题,我所要做的就是释放在我禁用 webDAV 服务器后挂起的锁。
之后,我重新启用了 webdav 服务器,该功能继续正常工作,这意味着 wevDAV 服务器仅在未记录的特定条件下获取锁。
我想,我应该分享此信息以帮助可能遇到相同问题的其他人