2012-05-03 29 views
1

具有相同的URI重複的文檔我想基於使用MarkLogic作爲數據存儲在我的應用程序複製文檔URI來實現樂觀鎖定。異常在MarkLogic

我閱讀xdmp:document-insert()文檔,發現MarkLogic在插入具有相同URI的其他頁面時不會引發異常,而是使用新頁面的內容更新頁面內容,頁面權限和屬性。但是在MarkLogic中我們可以通過什麼方式實現這一點?

回答

2

測試文檔是否存在等你插入之前。我認爲cts:uri-match是最快的方法之一。如果它已經存在,你可以使用fn:error()來拋出你自己的例外。

不知道這是什麼得到了與樂觀鎖雖然做..

1

您將要使用,以測試文檔的存在:

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

這將在沒有實際加載文檔的情況下測試URI上是否存在文檔。然後,您可以確定,想要如何處理這種情況。

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會發生重大爭用的情況下,該方法可以提供更好的性能。