2016-04-27 19 views
1

documentDbストアドプロシージャを同時に実行し、同じオブジェクトを更新できますか? documentDbはそれらを順番に処理しますか?DocumentDbストアドプロシージャを並列に実行する

以下のシナリオを考えてください。

私はアプリを持っており、ユーザーはタスクを完了すると10000個のコインを自分の脇に届けることができます。そして私は、私は、このオブジェクトから10ポイントを減算し、ユーザーのポイントに追加しますストアドプロシージャを持って、次のオブジェクト

{ 
    remainingPoints: 10000 
} 

をしています。

今、10人のユーザーが同時にタスクを完了し、同時にストアドプロシージャを10回コールすると、DocDbはそれらを順番に実行しますか?または、ストアドプロシージャを順番に実行する必要がありますか?

答えて

2

私が最初DocumentDBを使用して開始し、ここでは良い答えを持って、DocumentDB製品マネージャからのメールにするとき、私は同様の質問がありました。引用:

ストアドプロシージャ...トランザクションサポートのためのデータベースの独立したスナップショットを取得します。スナップショットは、sprocが実行を開始した時点(強く一貫性のある)での現在の状態(失効したデータはありません)を反映しています。

警告 - ストアドプロシージャがスナップショットで動作しているため、実行中に外部から新しい書き込みが入った場合でも、sprocで読み込み不能になる可能性があります。

また、ストアドプロシージャは常に自分の書き込みを読み込みます。

Sprocsは、マルチドキュメントトランザクションのためのDocumentDBのメカニズムです。 sprocの書き込みは、sprocが正常に実行を完了したときにコミットされます。例外がスローされた場合、sprocで行われたすべての作業はロールバックされます。

したがって、2つのsprocsが並行して実行されている場合は、お互いの書き込みが見えません。

両方のsprocsが同じドキュメントに書き込む(置き換えた)場合、書き込みをコミットしようとするとエタグの不一致が原因で2番目のエラーが失敗します。

これから、私は、ジュリアンが示唆しているように、私の執筆でETagsを確実に使用するように設計しました。私はまた、sprocの実行を3回まで自動的に再試行し、他の理由と並行して動作するために失敗した場合に対処します。実際には、私は3回のリトライを超えることはありません(sprocにバグがあった場合を除いて)、私は一回の再試行もめったにありません。

私は、レプリカを使い果たしてから順番に実行するまで、新しいsproc実行を別のレプリカに送信することを観察していると仮定します。したがって、並列実行とシリアル実行のハイブリッドです。

私が実験で学んだもう1つのヒントは、負荷の重いシステムでは、sprocではなく、純粋な読み取り操作(書き込みなしで有意な集約なし)をクライアント側で行うほうがよいということです。私は、DocumentDBが異なるレプリカからの異なる読み込みを並行して満たすことができるという利点があると考えています。私はexpandScriptの機能を使用して私のsprocコードをモジュール化して、書き込み検証、文書内の整合性、およびノー​​ドとノードの両方を使用することが可能であることを確認してください。主に.NETの場合でも、expandScriptsを使用して、sprocsをモジュラーDRY方法で構築することができます。あなたは、あなたのsprocsを前処理したり、Edge.NET(.NETの中で動作するノード)を使用してその場で行うために、ビルドプロセスでnode.jsを実行する必要があります。

+0

詳細な説明ありがとう@Larry :) –

0

あなたのコレクションに選択した一貫性によって異なります。しかし、DocumentDbは、etagを使って並行処理を行い、ドキュメントバージョンのスナップショットでストアドプロシージャを実行し、実行が成功した場合にのみ結果をコミットするという考え方です。

参照:https://azure.microsoft.com/en-us/documentation/articles/documentdb-faq/#develop

このスレッドはあまりにも役立つことがあります。Atomically increment an integer in a document in Azure DocumentDB

+1

Julien、私は現在の整合性レベルがクライアント側の操作でのみsproc実行に影響を与えるとは考えていません。すべてのsprocsは独立したスナップショットで実行され、すべての操作がすべて機能するか、すべてが失敗します。あなたが示唆するように、同じドキュメントに対するすべての読み書き操作にETagsを使用します。 –

関連する問題