【问题标题】:How to visualise update and later rollback JavaScript update transactions如何可视化更新和稍后回滚 JavaScript 更新事务
【发布时间】:2020-05-25 00:05:37
【问题描述】:

我有 JavaScript 程序,其中包含两个事务:

T1 -> 在数据库中生成新文档(更新语句)

T2 -> 转换现有的 MarkLogic 文档

这个程序的成功执行需要两个事务要么成功要么回滚。

我希望控制执行,以便我可以看到内存中的新文档,但稍后在 T1 测试后回滚。如果我对 T1 完全满意,请继续 T2。

在 RDBMS (Oracle) 中,我可以操纵、查看和回滚此类更改(类似于拍摄快照,当操作完成时,快照会被丢弃)。

如何在 MarkLogic 中获得这样的控制权?

【问题讨论】:

  • xdmp.eval 在以下情况下不起作用:declareUpdate(); const sem = require("/MarkLogic/semantics.xqy"); sem.rdfInsert([ sem.triple( sem.iri("http://example.org/band/The_Beatles"), sem.iri("http://example.org/band/origin"), sem.iri("http://example.org/band/United_Kingdom") ) ]); 这只是一个简单的单语句事务。

标签: javascript transactions updates marklogic rollback


【解决方案1】:

插入发生在当前语句的末尾,因此要查看结果,有必要启动一个多语句事务,插入一个语句,读取下一个语句,然后提交或回滚。

也就是说,在 MarkLogic 中,更好和常见的方法是在插入之前验证输入,以便事务可以在单个语句中发生。如果输入有效且可用于主模块,则几乎没有任何理由从持久数据中重新读取输入。

例如,对于三元组,通常使用 sem.rdfParse() 并在执行 sem.rdfInsert() 之前验证三元组。或者,如果使用 TDE 投影三元组,则在 xdmp.documentInsert() 之前执行 tde.nodeDataExtract()。

希望对您有所帮助,

【讨论】:

  • 非常感谢!如果xdmp.eval/invokeFunction 无法控制事务模式,则很难控制 JavaScript 事务。让我们简化为 T1,即查询然后插入新文档。查询的逻辑是在 ONE 属性(例如名称)上搜索具有重复值(例如 70 个重复名称)的文档,迭代此类文档,检索所需的值(例如 70 个主题/每个名称),然后创建一个三重组成70 个主题。这是查询和更新事务的组合。
  • 结果是在同名上插入了 70 个三元组。如果它是重复名称,甚至指令是停止插入......期望的结果是每个不同名称上的一个 XML 三元组。我设法将查询结果从 70 减少到 1,迭代并在每个不同的名称上生成一个 Triple。如果事务是严格的QUERY模式,似乎没有这个问题。
  • 从这些额外的 cmets 来看,这个问题听起来不像是回滚。如果我正确理解了这个问题,最好的方法是让控制逻辑首先在独立事务中调用更新逻辑并提交自动的查询逻辑,然后在独立事务中调用更新逻辑,更新为真并提交自动。换句话说,控制逻辑应该与查询和更新逻辑位于一个单独的事务中,并为所有三个逻辑自动提交。
  • 我对 JavaScript 事务的理解默认是自动提交。您可以通过这些 xdmp 函数控制事务类型。回滚的背景是 xdmp.invoke/eval/invokeFunction 不适用于 RDF 插入或 SPARQL 更新。我认为语义模块导入和 RDF 插入复杂性是主要障碍。
  • 如果查询逻辑返回可能是重复的预先存在的三元组,控制逻辑可以在将其余三元组交给更新逻辑之前过滤掉这些三元组。另一方面,RDF 允许重复的三元组,而 SPARQL 可以过滤掉重复项作为查询的一部分。然而,重复数据删除成本很高,因此最好在插入之前过滤掉重复数据。
猜你喜欢
  • 1970-01-01
  • 2016-05-02
  • 1970-01-01
  • 2019-02-19
  • 1970-01-01
  • 2022-09-27
  • 2016-07-26
  • 2017-11-10
  • 1970-01-01
相关资源
最近更新 更多