【问题标题】:MarkLogic : Switching between databases with xdmp.evalMarkLogic:使用 xdmp.eval 在数据库之间切换
【发布时间】:2019-03-18 16:21:34
【问题描述】:

MarkLogic 版本:9.0-6.2

我们有一个自定义 REST API,它从 STAGING 读取文档,然后更新 FINAL 中的一些文档,然后在 STAGING 文档上运行 xdmp.documentRemoveCollections。

第 1 步:从 STAGING DB 开始。阅读文档

第 2 步:切换到 FINAL DB,将更改应用到 FINAL DB 中的多个文档

第 3 步:切换到 STAGING DB,对第 1 步中读取的文档应用 xdmp.documentRemoveCollections

我们正在使用 xdmp.eval 在数据库之间切换,但注意到服务超时,可能是因为在数据库之间切换。 (例如,如果我们删除 xdmp.documentRemoveCollections 步骤,那么服务不会超时,可能是因为它不必从 FINAL 切换到 STAGING)

我们尝试使用协调流,但行为不一致,可能是因为 FINAL 中有多个文档更新。

请建议是否在 CUSTOM REST API 中采取任何预防措施以避免在数据库之间来回切换时超时。

提前致谢!

【问题讨论】:

    标签: marklogic marklogic-9 marklogic-dhf


    【解决方案1】:

    在这种情况下超时可能是由于在同一事务中对同一文档的读取和写入。第 3 步不应该“切换”它应该已经在同一个数据库中的数据库,唯一的切换是第 2 步。这个工作流程很容易死锁,无需特别注意。 第 2 步是否需要同步?如果不建议将其排队到任务服务器。 1,3 是否需要在同一事务中?步骤 1 可能会锁定它读取的文档 - 然后步骤 3 尝试等待该锁定释放以便更新。 尝试强制第 1 步成为读取事务,并验证它在第 3 步之前一直保持这种状态。您可以完全隔离它们,在子事务中执行所有步骤(单独)。 推荐使用调用函数(或模块)而不是 eval(带字符串)——使用 eval("some string I built by concatenating user input") 很容易获得'xquery injection'行为(来自朋友或敌人)

    您是否与其他活动同时执行此操作(相同的 REST 调用或同时对同一数据库的不同调用)。

    利用“查询控制台”来查找在什么时间打开的交易。如果你看到一个“挂起”,那么几乎可以肯定你会发现一个未完成的交易潜伏着。

    【讨论】:

    • 您是否在步骤 2 中调用 eval() 来调用步骤 3?不要那样做。而是从第 2 步返回,然后从第 3 步中断的地方继续
    • 非常感谢您的回复。我在第 2 步中有一个 eval 指向 FINAL 数据库,然后我返回第 3 步。您能否帮助说明“尝试强制第 1 步成为读取事务并验证它在第 3 步之前保持这种状态。”?是否存在不获取读锁的特定搜索模式?另外,如果我在第 2 步中发出提交,会释放锁并运行第 3 步吗?或者,我可以在发出 xdmp.documentRemoveCollections 之前在第 3 步发出提交以释​​放任何锁吗?提前致谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多