2016-06-30 25 views
4

これはDocumentDBに関する新しい質問です。アプリケーションにDocumentDBを使用したいと考えています。 DocumentDBに格納されているデータを複数のユーザーが変更しています。あるユーザーが別のユーザーの変更を上書きしないようにするにはどうすればよいですか?DocumentDBの並行性

答えて

-4

DocumentDBは並行性を保護しません。既存の文書に新しいバージョンの文書を投稿すると、古い文書は上書きされます。並行書き込みに対して保護できる場合は、文書のタイムスタンプを使用する必要があります。 documentDB内のすべてのドキュメントには、最後のアクションのタイムスタンプがあります。

更新するたびに、更新するドキュメントのタイムスタンプが取得したタイムスタンプと同じか、変更されたかどうかを確認できます。 isが変更された場合、ユーザーには最新のバージョンがないため、更新をキャンセルすることができます。

最高のことは、ストアドプロシージャを作成して、このロジックをストアドプロシージャ内に配置して、アプリケーションに依存しないようにすることです。

+4

これを特に扱う組み込みのETagメカニズムがあります。タイムスタンプをチェックしても、サーバーがETagに基づく書き込みを拒否することはできません(2人のライターは同時にタイムスタンプをチェックできます)。 –

+1

デビッドが本当に良い答えです。 「楽観的同時実行性」、「ETag」、これらは正しい用語です。 ETagがタイムスタンプであることは明らかではありません。また、私はsprocsが2人のユーザーから来る書き込みのこの単純な状況に最適であるとは言いません。 ETagメカニズムは、sprocsよりもエラー処理に対処する方が簡単で簡単です。 Sprocs _は、あなたが同じトランザクションで読み書きしている場合、またはお互いに一貫している必要がある複数の書き込みを行っている場合に最適です。私はまた、データ検証を行うための書き込みのためにsprocsを好む。 –

13

DocumentDBにはのオプティミスティックな並行性があり、各ドキュメントにはETagがあります。書き込み中にETagが変更された場合、書き込みは失敗します(ETagが変更された場合、他の誰かがその文書を変更したことを意味します)。この状態では、問題のドキュメントを再度読み込んで変更する必要があります。

詳細はfaq hereを参照してください。

+2

具体的には、リクエストオプションとaccessConditionプロパティを使用して、etagとIfMatch条件を指定できます。 – njappboy

+0

https://peter.intheazuresky.com/2016/04/28/documentdb-revisited-part-3-concurrency-in-documentdb/にはETagの使用法の詳細があります。 – njappboy