如何可视化更新和稍后回滚JavaScript更新事务

如何可视化更新和稍后回滚JavaScript更新事务,javascript,transactions,updates,marklogic,rollback,Javascript,Transactions,Updates,Marklogic,Rollback,我有一个包含两个事务的JavaScript程序: T1->在数据库中生成新文档(update语句) T2->转换现有MarkLogic文档 此程序的成功执行需要两个事务成功或回滚 我希望控制执行,这样我可以看到内存中的新文档,但稍后在T1测试后回滚。如果我对T1完全满意,继续T2 在RDBMS(Oracle)中,我可以操纵、查看和回滚这些更改(类似于拍摄快照,当操作完成时,快照被丢弃) 如何在MarkLogic中获得这种控制?插入发生在当前语句的末尾,因此要查看结果,必须启动多语句事务,插入一条

我有一个包含两个事务的JavaScript程序:

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

T2->转换现有MarkLogic文档

此程序的成功执行需要两个事务成功或回滚

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

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


如何在MarkLogic中获得这种控制?

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

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

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


希望这会有所帮助,

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

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

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


希望这能有所帮助,

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")     )    ]);这只是一个简单的单语句事务。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")     )    ]);这只是一个简单的单语句事务。非常感谢!如果
xdmp.eval/invokeFunction
无法控制事务模式,则很难控制JavaScript事务。让我们简化到T1,即查询然后插入新文档。查询的逻辑是在一个属性(例如名称)上搜索文档,该属性的值具有重复项(例如70个重复名称),迭代此类文档,检索所需值(例如70个主题/每个名称),然后创建一个包含70个主题的三元组。这是查询和更新事务的组合。结果是在同一个名称上插入了70个三元组。即使指令是停止插入,如果它是重复的名称…期望的结果是每个不同的名称上有一个XML三元组。我设法将查询结果从70减少到1,对每个不同的名称进行迭代并生成一个三元组。如果事务是严格的查询模式,则似乎没有问题。从这些附加注释来看,问题听起来不像是回滚。如果我正确地理解了这个问题,那么最好的方法是让控制逻辑首先使用update false和commit auto在独立事务中调用查询逻辑,然后使用update true和commit auto在独立事务中调用更新逻辑。换句话说,控制逻辑应该与查询逻辑和更新逻辑在一个单独的事务中,这三个逻辑都是自动提交的。默认情况下,我对JavaScript事务的理解是自动提交。您可以通过这些xdmp函数控制事务类型。回滚的背景是
xdmp.invoke/eval/invokeFunction
不适用于RDF insert或SPARQL更新。我认为语义模块导入和RDF插入的复杂性是主要的障碍。如果查询逻辑返回先前存在的三元组,这些三元组将是重复的,那么控制逻辑可以在将其余三元组交给更新逻辑之前过滤掉这些三元组。另一方面,RDF允许重复的三元组,SPARQL可以在查询中过滤出重复的三元组。但是,重复数据消除非常昂贵,因此最好在插入之前过滤掉重复数据。非常感谢!如果
xdmp.eval/invokeFunction
无法控制事务模式,则很难控制JavaScript事务。让我们简化到T1,即查询然后插入新文档。查询的逻辑是在一个属性(例如名称)上搜索文档,该属性的值具有重复项(例如70个重复名称),迭代此类文档,检索所需值(例如70个主题/每个名称),然后创建一个包含70个主题的三元组。这是查询和更新事务的组合。结果是在同一个名称上插入了70个三元组。即使指令是停止插入,如果它是重复的名称…期望的结果是每个不同的名称上有一个XML三元组。我设法将查询结果从70减少到1,对每个查询进行迭代并生成一个三元组