在MarkLogic中删除不同事务中的三元组

时间:2018-07-06 12:26:56

标签: marklogic marklogic-8

我正在使用MarkLogic 8

我必须在第一条语句中使用sem:sparql-update删除三元组,并且不想在下一条语句中使用sem:sparql删除相同的三元组。

我尝试在sem:sparql-update中传递xdmp:invoke-function,但无法正常工作。

sem:sparql-update中,默认的隔离将是'different-transaction'。如果是这种情况,我认为我不应该在sem:sparql-update的立即声明中获取已删除的三元组。

请帮助!

2 个答案:

答案 0 :(得分:3)

您需要同时在sem:sparql-update中运行sem:sparqldifferent-transactions。 sem:sparql否则将以请求的时间戳记运行,该时间戳记会调用更新程序,而更新程序本身会提前更新,因此它将永远无法看到更新程序。

这是MarkLogic用于事务处理的MVCC方法的一部分。

HTH!

答案 1 :(得分:1)

我强烈建议您阅读《应用程序开发人员指南》的Understanding Transactions in MarkLogic Server一章。

MarkLogic中的语句是请求或更新。请求在特定的时间戳下发生并且是只读的,这意味着它们看到的内容是稳定的。因此,请求不必担心写锁。更新会更改数据库。对于XQuery,MarkLogic通过静态分析知道您正在做什么(对于JavaScript,您必须调用declareUpdate())。如果不确定正在运行哪个,可以致电xdmp:request-timestamp;请求将为您提供一个值,但更新将为您提供空序列。

您要进行更新,并使这些更改对以后的SPARQL查询可见。有两种可能的方法,具体取决于父请求是查询还是更新。

在任何一种情况下,您都可以正确地进行sem:sparql-update呼叫需要进行其他事务。

父项是更新

如果父请求是更新,则在单独事务sparql-update之后发出的请求将可见。除了确保您的读取来自sparql-update之后,您不需要执行任何特殊操作。

父项是查询

如果父请求是查询,则它将在设置的时间戳上运行,并且不会看到sparql-update的结果。在这种情况下,您还希望将sem:sparql作为单独的事务运行,这将使它可以查看已完成的更新事务的结果。

请注意,如果父级是一个查询,则从技术上来说,将其设为是一个更新,但这并不是一个好的计划。在这种情况下,整个父请求将需要担心更多的锁。