Locking 在Marklogic中的指定时间释放所有文档锁

Locking 在Marklogic中的指定时间释放所有文档锁,locking,xquery,marklogic,marklogic-10,Locking,Xquery,Marklogic,Marklogic 10,我们计划在MarkLogic中使用无超时选项的xdmp:lock acquireAPI为文档实现锁定机制。该文档将被锁定,直到用户编辑并保存该文档。作为其中的一部分,我们需要在指定的时间释放所有锁,例如每天上午12点 为此,我们可以使用xdmp:lock-releaseAPI,但如果有很多文档,则需要一些时间才能完成 有人能在MarkLogic中提出更好的方法来实现这一点吗?如果您需要处理一组可能很大的锁,并且担心在单个事务中执行所有工作时出现超时或其他问题,那么您可以将工作分解为较小的块或单个

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

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


有人能在MarkLogic中提出更好的方法来实现这一点吗?

如果您需要处理一组可能很大的锁,并且担心在单个事务中执行所有工作时出现超时或其他问题,那么您可以将工作分解为较小的块或单个事务

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

如果希望从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)
声明函数本地:释放锁($locks,$chunk size){
如果(存在($locks))
然后(
(:释放所有这些锁(您可以应用某种筛选器来限制某个子集,
如果锁在运行之前被释放,可能需要尝试/捕获):)
$locks[1到$chunk size]!xdmp:节点uri(.)!xdmp:锁释放(.),
(:现在生成下一个要在单独事务中发布的集合:)
xdmp:spawn函数(函数(){
本地:释放锁(子序列($locks,$chunk size+1),$chunk size)
}, 
真的
汽车
)
)
else()(:无事可做,停止繁殖工作:)
};
让$locks:=xdmp:document-locks()
让$chunk size:=1000
本地:释放锁($locks,$chunk size)
如果您希望沿着这条路线走下去,有一些可用的库:


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

如果您需要处理大量的锁,并且担心在一个事务中执行所有工作时出现超时或其他问题,然后,您可以将工作分解为更小的块或单个事务

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

如果希望从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)
声明函数本地:释放锁($locks,$chunk size){
如果(存在($locks))
然后(
(:释放所有这些锁(您可以应用某种筛选器来限制某个子集,
如果锁在运行之前被释放,可能需要尝试/捕获):)
$locks[1到$chunk size]!xdmp:节点uri(.)!xdmp:锁释放(.),
(:现在生成下一个要在单独事务中发布的集合:)
xdmp:spawn函数(函数(){
本地:释放锁(子序列($locks,$chunk size+1),$chunk size)
}, 
真的
汽车
)
)
else()(:无事可做,停止繁殖工作:)
};
让$locks:=xdmp:document-locks()
让$chunk size:=1000
本地:释放锁($locks,$chunk size)
如果您希望沿着这条路线走下去,有一些可用的库:


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

非常感谢!我将尝试这些,并让您知道。我使用计划任务尝试了锁释放过程,它成功了。但是是否有方法可以获取计划任务的状态,无论它是否尚未启动/启动/进行中/取消/完成?您可以查看任务服务器上正在运行的查询。有各种各样的API用于此。您还可以在模块中放置一些日志消息,用xdmp:log()或xdmp:trace()指示执行的开始和结束。如果计划任务仍在进行或完成,我需要向前端发送消息。因此,根据任务服务器状态,我需要发送此消息。非常感谢!我将尝试这些,并让您知道。我使用计划任务尝试了锁释放过程,它成功了。但是是否有方法可以获取计划任务的状态,无论它是否尚未启动/启动/进行中/取消/完成?您可以查看任务服务器上正在运行的查询。有各种各样的API用于此。您还可以在模块中放置一些日志消息,用xdmp:log()或xdmp:trace()指示执行的开始和结束如果计划任务仍在进行或完成,我需要向前端发送消息。因此,根据任务服务器状态,我需要发送此消息,对吗?