2012-01-02 21 views
2

次の問題があります。ステートレスRESTサーバーにRavenDBを使用してキューの抽象化を実装しています。RavenDBでドキュメントのアトミック同時読み込みを実装するにはどうすればよいですか?

は、私は2 RESTコールAが起こっているときにAとB

が、私は最後の項目(項目A)のためのキューを照会し、通話Bが呼び出された場合A.

を呼び出すためにそれを与える呼び出していると仮定しますコールAと同時に - RESTコールで発生する可能性があるので、コールBにコールAと同じアイテムを与えることを防ぐ必要があります。コールAによって意味のあるアイテムAが「ロック」されている必要があります。

標準マルチここでのスレッド保護は単純なロックになりますが、RavenDBとRESTを使ってこのアイデアを自分の状況に変換するにはどうすればいいですか?

私は私が何か見落としていない限り、あまりにも難しいことではありませんRESTサーバー

答えて

5

ためNancyを使用P.S:例えば、

があなたの項目にフラグ(ブールプロパティ)を導入します"処理済み"。 アクションの中で、新しいRavenDBセッションを開いて、楽観的同時実行を有効にしてください(DocumentSession.Advanced .UseOptimisticConcurrency)。 未処理の次のアイテムを取得し、処理済みフラグを直ちにtrueに更新します。 あなたのセッションで.SaveChangesを呼び出します。>成功した場合(あなたはConcurrencyExceptionを取得していません)、要求の結果として安全にアイテムを返すことができます。そうでない場合は、次の項目を読み込みます。

+0

両方の呼び出しが同時に正確に更新され、例外がスローされない場合がありますか?私はそれがRavenDBの内部でどのように実装されているかに依存していると思います。 –

+1

いいえ、それは不可能です。 'SaveChanges'への呼び出しの間のあなたの文書のすべての変更は完全にトランザクション的です。セッションでOptimisticConcurrencyを有効にする前に他の誰もこの文書を変更していないことが保証されています。 (btw:RavenDBはSystem.Transactionもサポートしているので、より長いトランザクションにまたがることができますが、あなたと同じように、情報と同様に)意味がありません。 –

+0

@DanielLangこんにちはDaniel、あなたの答えは非常に有用です。 「Processed」のような単一のフィールドでUseOptimisticConcurrencyを使用することで、(分散環境で)RavenDBのクラスタを訪れる多くのクライアントのアトミック性を保証できますか?あるいは明示的な「取引」が必要ですか?どうもありがとう。 – Dodd

関連する問題