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

xquery-Marklogic提交帧/返回序列保证

(xquery - Marklogic commit frame/return sequence guarantee)

发布于 2020-12-07 21:02:16

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

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

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

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

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) )

ps请忽略[1到5]文档限制。添加用于测试。

Questioner
JaredD
Viewed
0
Mads Hansen 2020-12-08 06:13:53

如果上述任何一个步骤失败,是否仍会删除该文档?

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

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

我应该信任引擎按给定的顺序执行返回序列吗?

鉴于上述陈述,不确定这有多重要。

这个结构安全吗?

目前尚不清楚你可能要处理多少个文档。你可能会发现使用该过滤器更好/更快,cts:search并且使用一些索引来定位候选文档。此外,即使你可以选择要更快处理的文档集,但是如果文档很多,你仍然可能会超出执行时间限制。

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

诸如CoRB之类的工具正是针对此类批处理工作而构建的。