首页 > 解决方案 > 在 Marklogic 中的指定时间释放所有文档锁

问题描述

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

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

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

标签: lockingxquerymarklogicmarklogic-10

解决方案


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

有多种批处理工具和框架可以做到这一点。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)

如果您想走这条路,可以使用一些库:

将多个项目生成到任务服务器上的风险是,如果出现重启或中断,一些任务可能无法执行,并且所有锁都可能无法释放。但是,如果您只是想释放所有锁,则可以重新运行脚本以开始另一轮。


推荐阅读