2016-09-02 13 views
0

注に変更された文書についての問い合わせ:私はこのpreviouslyに非常によく似た質問をし、私が探していたまさに上十分明確ではありませんでした、そしてあまりにも積極的に答えをマーク。私は特定の点で確認されたはい/いいえを探しています。はDocumentDb

私はチェックが実行された最後の時間以降に変更された文書を探して、スケジュールにDocumentDbを照会することによってDocumentDbドキュメントにオフライン処理を行い、自動化された仕事を構築したいです。 DocumentDbで利用可能なメタデータを考えると

、それは次のようになりますこれを行う方法のようになります。

  • プロセスが実行初めて、すべての文書を検索します。
  • ストア彼らの_ts値としてその特定の値を持つ文書のIDとのetagsと一緒にhighwatermarkの結果セットから最大_ts値、。
  • 後続のクエリごとに、「WHERE _ts> = highWatermark」節を含めます。 eTagsが変更されていない以前に記録された文書をフィルタリングします。結果は、クエリが最後に実行されて以来のすべての変更のセットです。

私の質問はであることが保証されていますか?保証付きこれはいかなる書類も見逃すことはありませんか?私が知る限り、DocumentDbの実装では_tsの周りのトランザクションのセマンティクスになりますが、これはこの詳細レベルには記載されていません。私は何の文書は、コレクションの中で最も最近に変更された文書を返すクエリ中に返さ最大 _ts値より低い_ts値で更新できないことを保証していますかどうかを知りたいです。特定のシナリオのカップルと、もう少し正確には

:デビッドさんのコメントによって促さ

EDIT、

  1. 二つの文書、D0とD1、のための更新がに適用されている場合T0とT1のデータベース(T1> T0、任意のクエリがD0を返すがD1は返さないような場合)は、D0._ts> D1._ts?私の提案された実装では、同じ_tsを受け取る複数の更新を扱いますが、それらのうちの一部のみがクエリによって取得されるため、strictly-greater-thanの使用は意図的です。
  2. 私は時間T0で私の実装のクエリを実行したとし、クエリの実行に時間がかかり、および/またはExecuteNextAsync(のカップルが必要です)サーバから複数のバッチを引っ張って呼び出します。その期間に、T1とT2の値を取得する(T1 < T2)2つの異なる文書(D1とD2)が更新されます。 D2が結果セットに現れることは可能ですか?もっと重要なのは、それが含まれていると保証されているのですか?
+1

大量のドキュメントがあるとします。 _tsのハイウォーターマークを設定しますが、処理中に以前に処理されたドキュメントの1つが別のプロセスによって更新されるため、ハイウォーターマークよりも新しいタイムスタンプがあります。これは将来の処理パスで文書の更新が見逃されるような最悪のケースではないでしょうか? –

+0

@DavidMakogon、私は私の質問にいくつかの精度を追加しました。あなたのシナリオは、私が把握しようとしていることの一部を表しています。クエリー結果が返される過程でドキュメントDが更新された場合、D._tsは結果セットの中の最大の_tsよりも厳密に小さいのでしょうか? rowversionの値はコミット時に単調増加することが保証されているので、SQL Serverでこのような保証が得られますが、_tsはウォールクロックのタイムスタンプに基づいているため、このようなシナリオでは何が保証されているのかわかりません。 – nlawalker

答えて

1

デフォルトの整合性では、_tsの値が低い文書が後で表示される可能性があるため、これは動作するとは限りません。ただし、更新要求が十分離れている(たとえば60秒)と保証できる場合、リスクは非常に低くなります。

私はデビッドのエッジケースがそう長くあなたの御馳走として、新たな、より高い_tsを持つすべてのドキュメントの心配はないと思います。

Richard Snodgrassの一時的なモデルなどを使用して、追加のみのアプローチを検討することもできます。これは、冪等のセマンティクスを容易にします。