【问题标题】:Release all document locks at a specified time in Marklogic在 Marklogic 中的指定时间释放所有文档锁
【发布时间】:2021-03-09 23:48:38
【问题描述】:

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

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

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

【问题讨论】:

    标签: locking xquery marklogic marklogic-10


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 非常感谢!将尝试这些并让您知道。
    • 我尝试了使用计划任务的锁定释放过程并且它有效。但是有没有办法我们可以获取计划任务的状态是否尚未开始/开始/正在进行/取消/完成了吗?
    • 您可以看到任务服务器上正在运行哪些查询。有各种各样的API。您还可以在模块中放置一些日志消息,以使用 xdmp:log() 或 xdmp:trace() 指示执行的开始和结束
    • 如果调度任务仍在进行中或完成,我需要向前端发送消息。所以根据任务服务器状态,我需要发送这个对吗?
    猜你喜欢
    • 2016-10-02
    • 1970-01-01
    • 2017-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    相关资源
    最近更新 更多