MarkLogic中具有相同URI的重复文档的例外情况

时间:2012-05-03 09:41:05

标签: marklogic

我想使用MarkLogic作为数据存储区,在我的应用程序中基于重复的文档URI实现乐观锁定。

我阅读了xdmp:document-insert()文档,发现MarkLogic在插入具有相同URI的其他页面时不会抛出异常,而是使用新页面的内容更新页面内容,页面权限和属性。但是,我们有什么办法可以在MarkLogic中实现这一目标吗?

4 个答案:

答案 0 :(得分:3)

答案很好,但我认为您需要备份并询问您的应用程序目标是什么,而不是假设您需要实现乐观锁定。 MarkLogic Server在内部执行乐观锁定,因此您可能不需要担心它。有关MarkLogic和事务的更多背景信息,请阅读http://docs.marklogic.com/5.0doc/docapp.xqy#display.xqy?fname=http%3a//pubs/5.0doc/xml/dev_guide/transactions.xml

如果您确实需要在更新中检查文档是否存在,请使用fn:doc - 而不是cts:uri-matchxdmp:exists。这些函数非常适合只读查询,因为它们不会将文档加载到内存中。这对于只读查询很好。但是,如果您需要在更新中检查文档是否存在,则需要对其进行读锁定以确保一致性。否则,您将拥有似乎有效的代码,但可能存在竞争条件。要确保您采用读锁定,请使用fn:exists(fn:doc($uri))或在有效的布尔上下文中调用fn:doc($uri)

http://docs.marklogic.com/5.0doc/docapp.xqy#display.xqy?fname=http://pubs/5.0doc/apidoc/UpdateBuiltins.xml&category=UpdateBuiltins&function=xdmp:lock-for-update也可能是有意义的。 xdmp:lock-for-update函数绕过默认的乐观行为并显式锁定URI。如果您在更新代码中尽早执行此操作,则会产生悲观锁定。在您知道URI存在严重争用的情况下,该方法可以提供更好的性能。

答案 1 :(得分:2)

在插入之前测试doc的存在性。我认为cts:uri-match是最快速的方法之一。如果它已经存在,您可以使用fn:error()抛出自己的例外。

不确定这与乐观锁定有什么关系..

答案 2 :(得分:1)

您需要使用以下方法测试文档是否存在:

  

xdmp:存在(FN:DOC($ URI))

这将测试URI上是否存在doc而不实际加载doc。然后,您可以确定您希望如何处理这种情况。

答案 3 :(得分:0)

您还可以使用fn:doc-available()函数。如果文档存在,则返回布尔值true,否则返回布尔值false。

在此处查找详细信息-https://docs.marklogic.com/fn:doc-available