【问题标题】:Marklogic commit frame/return sequence guaranteeMarklogic 提交帧/返回序列保证
【发布时间】: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) )

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

【问题讨论】:

    标签: xquery marklogic


    【解决方案1】:

    如果前面的任何步骤都失败了,文档还会被删除吗?

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

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

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

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

    这个结构安全吗?

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

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

    CoRB 等工具正是为此类批处理工作而构建的。

    【讨论】:

    • 谢谢。如果查询返回 5 个文档,并且由于文件名错误而无法保存第 4 个文档,回滚是否会恢复先前删除的 3 个文档? (提交框架缺乏理解..)
    • 数据库更改不会立即执行,而是排队等待代码完成。如果此时引发任何未捕获的错误,则不会保留所有排队的更改。因此,只要您不将 xdmp:save 包装在 try catch 中,如果任何写入失败,都不会删除任何数据库文档。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-22
    • 1970-01-01
    • 1970-01-01
    • 2017-11-08
    • 1970-01-01
    • 2022-06-11
    • 1970-01-01
    相关资源
    最近更新 更多