Marklogic commit frame/return 顺序保证

Marklogic commit frame/return sequence guarantee

我有一个简单的 1 节点 Marklogic 服务器,我需要每天清除文档。

下面的测试查询选择文档,然后 returns 一个序列,我想执行以下操作:

  1. 输出正在提取的文件名
  2. 确保#1 中文件的目录路径存在
  3. 将文档的压缩版本保存到 #1 中的文件。
  4. 删除文档

这个结构安全吗?它 return 是每个要删除的文档的序列。 returned 序列中的最后一项删除文档。如果前面的任何步骤失败,文档是否仍会被删除?我应该相信引擎会按给定的顺序执行 return 序列吗?

xquery version "1.0-ml";
declare namespace html = "http://www.w3.org/1999/xhtml";
let $dateLimitAll := current-dateTime() -xs:dayTimeDuration("P1460D")
let $dateLimitSome := current-dateTime() -xs:dayTimeDuration("P730D")
for $adoc in doc()[1 to 5]
 let $docDate := $adoc/Unit/created
 let $uri := document-uri($adoc)
 let $path:=  fn:concat("d:/purge/" , $adoc/Unit/xmldatastore/state/data(), "/", fn:year-from-dateTime($docDate), "/", fn:month-from-dateTime($docDate))
 let $filename :=  fn:concat($path, "/", $uri, ".zip")
where ( ($docDate < $dateLimitAll) or (($docDate < $dateLimitSome) and ($adoc/Unit/xmldatastore/state != "FIRMED") and ($adoc/Unit/xmldatastore/state != "SHIPPED")))
return ( $filename, xdmp:filesystem-directory-create($path, map:new(map:entry("createParents", fn:true()))), xdmp:save($filename, xdmp:zip-create(<parts xmlns="xdmp:zip"><part>{$uri}</part></parts>, doc($uri))), xdmp:document-delete($uri) )

p.s。请忽略 [1 到 5] 个文档的限制。添加用于测试。

If any of the prior steps fail, will the document still be deleted?

如果在执行该模块时出现错误,事务将回滚,从数据库中删除的操作将被撤消。

但是,写入文件系统的目录和 zip 文件将保留并且不会被删除。如果事务回滚,xdmp:filesystem-directory-create()xdmp:save() 函数不会回滚或撤消。

Should I trust the engine to execute the return sequence in order given?

鉴于上述陈述,不确定它是否重要。

Is this structure safe?

不清楚您可能要处理多少文档。您可能会发现过滤器是 better/faster 使用 cts:search 和一些索引来定位候选文档。此外,即使您可以 select 更快地处理一组文档,如果有很多文档,您仍然可能会超过执行时间限制。

另一种方法可能是分解工作。 Select 符合条件的文档的 URI,然后对负责保存 zip 文件和从数据库中删除文档的每个文档执行单独的查询。这可能会更快,因为您可以并行处理多个文档,避免超时的风险,并且在发生异常时,允许某些项目失败而不导致整个集合失败和回滚。

CoRB 等工具专为此类批处理工作而构建。