Marklogic中指定时间解除所有文档锁

Release all document locks at a specified time in Marklogic

我们计划在 MarkLogic 中使用 xdmp:lock-acquire API 为我们的文档实施锁定机制,没有超时选项。文档将被锁定,直到用户编辑并保存文档。作为其中的一部分,我们需要在指定时间释放所有锁,比如每天凌晨 12 点。

为此,我们可以使用xdmp:lock-release API,但如果文档很多,则需要一些时间才能完成。

有人可以建议在 MarkLogic 中实现此目的的更好方法吗?

如果您有可能需要处理的大量锁,并且担心超时或在单个事务中完成所有工作的其他问题,那么您可以将工作分解成更小的块或个人交易。

有多种批处理工具和框架可以做到这一点。 CoRB 是一个选项,可以轻松插入自定义选择器和处理脚本,并针对巨型集执行。

如果您希望从 MarkLogic 计划任务启动工作并在 MarkLogic 中执行所有工作,那么您可以生成多个任务来处理子集。

一个简单的示例,演示如何为每个事务设置“块大小”并继续产生更多工作:

declare function local:release-locks($locks, $chunk-size){
    if (exists($locks))
    then (
      (: release all of these locks(you might apply some sort of filter to restrict to a subset, 
         and maybe a try/catch in case the lock gets released before this runs) :)
      $locks[1 to $chunk-size] ! xdmp:node-uri(.) ! xdmp:lock-release(.),

      (: now spawn the next set to be released in a separate transaction :)
      xdmp:spawn-function(function(){ 
          local:release-locks(subsequence($locks, $chunk-size+1), $chunk-size) 
        }, 
        <options xmlns="xdmp:eval">
          <update>true</update>
          <commit>auto</commit>
        </options>)
    )
    else () (: nothing left to do, stop spawning work :)
};

let $locks := xdmp:document-locks()
let $chunk-size := 1000
local:release-locks($locks, $chunk-size)

如果您想沿着这条路走下去,可以使用一些图书馆:

在任务服务器上生成多个项目的风险在于,如果重启或中断,某些任务可能无法执行并且所有锁可能无法释放。但是如果你只是想释放所有的锁,那么你可以重新运行脚本来开始另一轮。