1

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

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

4

4 回答 4

3

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

当您确实需要在更新中检查文档是否存在时,请使用fn:doc-notcts: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 将存在严重争用的情况下,该方法可以提供更好的性能。

于 2012-05-03T16:58:50.203 回答
2

在插入之前测试文档的存在。我认为这cts:uri-match是最快的方法之一。如果它已经存在,您可以使用fn:error().

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

于 2012-05-03T10:42:02.957 回答
1

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

xdmp:exists(fn:doc($uri))

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

于 2012-05-03T13:59:31.537 回答
0

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

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

于 2019-12-02T11:16:10.297 回答