我想在我的应用程序中使用 MarkLogic 作为数据存储实现基于重复文档 URI 的乐观锁定。
我阅读了xdmp:document-insert()
文档,发现 MarkLogic 在插入具有相同 URI 的另一个页面时不会抛出异常,而是使用新页面的内容更新页面内容、页面权限和属性。但是有什么方法可以在 MarkLogic 中实现这一点?
我想在我的应用程序中使用 MarkLogic 作为数据存储实现基于重复文档 URI 的乐观锁定。
我阅读了xdmp:document-insert()
文档,发现 MarkLogic 在插入具有相同 URI 的另一个页面时不会抛出异常,而是使用新页面的内容更新页面内容、页面权限和属性。但是有什么方法可以在 MarkLogic 中实现这一点?
很好的答案,但我认为您需要备份并询问您的应用程序目标是什么,而不是假设您需要实现乐观锁定。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-match
或xdmp: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 将存在严重争用的情况下,该方法可以提供更好的性能。
在插入之前测试文档的存在。我认为这cts:uri-match
是最快的方法之一。如果它已经存在,您可以使用fn:error()
.
虽然不确定这与乐观锁定有什么关系..
您将需要使用以下方法测试文档是否存在:
xdmp:exists(fn:doc($uri))
这将在不实际加载文档的情况下测试 URI 中是否存在文档。然后,您可以确定您希望如何处理这种情况。
您也可以使用 fn:doc-available() 函数。如果文档存在则返回布尔真,否则返回布尔假。
在此处查找详细信息 - https://docs.marklogic.com/fn:doc-available