Warm tip: This article is reproduced from serverfault.com, please click

locking-在指定时间在Marklogic中释放所有文档锁

(locking - Release all document locks at a specified time in Marklogic)

发布于 2020-11-27 06:56:35

我们计划使用xdmp:lock-acquireMarkLogic中的API(无超时选项)为文档实现一种锁定机制该文档将被锁定,直到用户编辑并保存该文档为止。为此,我们需要在指定的时间(例如每天12:00 AM)释放所有锁。

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

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

Questioner
Antony
Viewed
0
Mads Hansen 2020-11-29 05:26:41

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

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

如果你想沿这条路线走,则有一些可用的库:

将多个项目产卵到任务服务器上的风险是,如果重新启动或中断,则某些任务可能无法执行,并且所有锁也可能无法释放。但是,如果你只是想释放所有锁,则可以重新运行该脚本以启动另一轮。