2017-09-27 5 views
-2

は、このコードを検討してください。私はこのコードが挿入されたドキュメントを返すと期待しますが、何も返しません。MarkLogic 9トランザクション動作の回避策

私は、ドキュメントがまだ時間は、fnでコミットされなかったので、それがあると仮定:DOC()呼び出しが行われます。 documentationは、ステートメントを更新内の更新情報が表示されていないことを示唆しているので、私は直感に反する1はいえ、この予想される動作を前提としています。

しかし、この奇妙な動作は基本的にすべての更新の機能が協調して動作する強制的に、トランザクション内の最後の文としてコミット行う前に計画され、メモリ内で作られるすべての更新が必要です。これはもちろん、実行中の機能の間に強力な相互依存性を強制するため、モジュラーソフトウェアを設計する際に問題を引き起こします。私が見つけた

この問題を回避するには、以下の通りです:

let $_ := xdmp:invoke-function(function() { xdmp:document-insert("/private/test.xml", <t13 />) }) 
let $doc := xdmp:invoke-function(function() { fn:doc("/private/test.xml") } ) 
return $doc 

各機能を呼び出す()の呼び出しとして、独自のトランザクション内で実行され、これは動作します。これは私の現在のユースケースのため、多少OKですが、それは確かにアプリケーションの動作を変更しても、他の多くの例のための一貫性の要件を壊すかもしれません。

私の質問:この

のための任意のより良い回避策がある。これは非常に期待される動作ではなく、奇妙な行動である K.

答えて

1

、ありがとうございました。 XQueryの本質は、すべてが任意の順序で実行可能でなければならないということです。すべてがトランザクション的なので、同じトランザクション内でドキュメントを作成して読み込むことはできません。

あなたが提供するコードの例ではやっているものを行うための最も簡単な方法は、に次のようになります。セミコロンを挿入

xdmp:document-insert("/private/test.xml", <t13 />) 
; 
fn:doc("/private/test.xml") 

別のトランザクションで実行する2つのコマンドを保証します。

xdmp:invoke-function()を使用しているあなたの例は、xdmp:invoke()を使用して、ドキュメントを挿入するメインモジュールを使用するとより効果的です。 uri、content、permissions、collectionsなどのパラメータを渡すこともできますし、メインモジュールのロジックを持つこともできます。

アプリケーション開発者ガイドで取引を扱う非常に良いドキュメントがあります:答えのためのhttps://docs.marklogic.com/guide/app-dev/transactions

+0

おかげで、私はセミコロンについて考えたが、それはfunction.Or内で使用することはできません、あなたはその一例の機能を私に提供することができます埋め込まれたセミコロンを使用して、私は確かにそれが仕事 –

+0

いいえ、あなたは正しい作ることができないのです。あなたが本当にことをしたい場合は、メインモジュールを実行すると、ライブラリモジュール対役立ちますところですが、あなたはまた、単にxdmpとメインモジュールで別のトランザクションで書き込み操作を呼び出すことができます:呼び出し()。 –