1

MarkLogic をデータストアとして使用するアプリケーションで、重複するドキュメント URI に基づく楽観的ロックを実装したいと考えています。

ドキュメントを読んだxdmp:document-insert()ところ、MarkLogic は同じ URI を持つ別のページを挿入しても例外をスローせず、代わりにページのコンテンツ、ページのアクセス許可、およびプロパティを新しいページの内容で更新することがわかりました。しかし、MarkLogic でこれを実現する方法はありますか?

4

4 に答える 4

3

良い答えですが、楽観的ロックを実装する必要があると推測するのではなく、バックアップしてアプリケーションの目標が何であるかを尋ねる必要があると思います。MarkLogic サーバーは内部的に楽観的ロックを行うため、おそらく心配する必要はありません。MarkLogicとトランザクションの背景については、http: //docs.marklogic.com/5.0doc/docapp.xqy#display.xqy?fname=http%3a//pubs/5.0doc/xml/dev_guide/transactions.xml を参照してください。

更新でドキュメントの存在を確認する必要がある場合は、-not または を使用fn:doccts: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 で激しい競合が発生することがわかっている状況では、そのアプローチによりパフォーマンスが向上します。

于 2012-05-03T16:58:50.203 に答える
2

挿入を行う前に、ドキュメントの存在をテストしてください。cts:uri-matchそのための最速の方法の1つだと思います。既に存在する場合は、を使用して独自の例外をスローできますfn:error()

ただし、これが楽観的ロックとどう関係があるのか​​ はわかりません..

于 2012-05-03T10:42:02.957 に答える
1

以下を使用して、ドキュメントの存在をテストする必要があります。

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

これにより、実際にドキュメントをロードせずに、URI にドキュメントが存在するかどうかがテストされます。次に、状況をどのように処理するかを決定できます。

于 2012-05-03T13:59:31.537 に答える