2017-06-08 17 views
2

RethinkDBはatomicity guarantees under certain conditionsを返します。私はリビジョンフィールドを使ってオプティミスティックな並行処理(c#)を実装しようとしています。クライアントが自分のリビジョンを編集している間にデータが変更された場合、更新は失敗するという考えがあります。新しいエントリを挿入する必要があります。RethinkDBで原子的条件付き更新

var id = "some unique id"; 
var rev = "the old known revision"; 
var doc = new {id, Revision = Guid.NewGuid().ToString("N")}; 
var result = await R.Db("test").Table("table") 
    .Get(id) 
    .Replace(found => 
     R.Branch(
      found.Eq(null), doc, 
      found["Revision"].Eq(rev), doc, 
      found 
     ) 
    ).RunResultAsync(connection); 

上記のコードは、この目的のために働くようだが、それは確かにタイトな同時アクセスのための競合状態を排除する場合、私は思ったんだけど。言い換えれば、この更新/挿入またはupsertアトミックですか?可能であれば、私にいくつかの文書を案内してください。

ドキュメントには、実際にどの操作が原子的であるかを説明するのに役立つように、(これはCAS、比較およびスワップの可能性があります)のチェック・アンド・セット・レジスタそれは(例えば統合テストを使って)。

  • write_acks:

    は、私は次の基準を満たしている場合という印象取得過半数を

  • 耐久性:ハード
  • read_mode:大半

そして書き込みが関与していない場合二次照会または他の文書の場合、書き込みは不可分です。そこに私の好み、それらのifsにあまりにも多くの信仰があります。私は、操作がアトミックでなければならない旗や何かがあればそれを好むだろう、そうでなければそれを核にする。それまでは、私の印象を信じることができますか? confusion on SOもあります。

答えて

3

サンプルクエリはアトミックです。これは、Replaceを使用して1つのドキュメントを変更するため、アトミックです。複数のドキュメントを変更した場合、クエリ全体はアトミックではありませんが、各ドキュメントの変更は個別のアトミック操作になります。

Replaceには、nonAtomicのフラグがあります。デフォルトはtrueです。 nonAtomic引数をReplaceに渡さない限り、Replaceに渡される関数はアトミックに実行されます。

atomicまたはnonAtomicというフラグはありません。あなたはアトミック非決定的操作を実行しようとすると、

RethinkDBは、エラーがスローされます。

は、引数が決定論的証明することができませんでした。おそらくnon_atomicフラグを使いたいのですか?

を読んで、単一のアトミック操作でドキュメントを変更、更新を使用するか、コマンドを置き換えるには:

documentation you linked toがいることを言及しています。

チェック・アンド・セット・レジスタは、アトミックに実行できる操作の単なる例です。これはまた、原子操作の警告を示すのに役立ちます。ReplaceまたはUpdateに渡される関数だけが原子です。周囲のクエリは、たとえばFilterまたはGetAllではありません。

RethinkDB操作がdiscussion you linked toを読み込み、複数のキー

全体にアトミックことはありません、混乱は、ドキュメントのエラーに由来すると思われます。これは、エラーがスローされますデフォルトRethinkDBで、

ユーザーはがアトミックに実行することができないのクエリを実行します 場合

を言うために使用されます。

しかし更新またはクエリを交換するには、デフォルトRethinkDBで、アトミックに実行できない場合

を言うために修正されましたHow does the atomicity model work?にも

を参照してくださいエラー

がスローされます

書き込みアトミック性は、ドキュメントごとにサポートされます。単一のJSONドキュメントへの更新はアトミックであることが保証されています。原子文書の更新は可能な操作の小さなサブセットに限定されない点でRethinkDBは他のNoSQLシステムと異なります。単一の文書に対して実行可能な操作の組み合わせは、文書をアトミックに更新することが保証されます

+0

Wonderful、ありがとうございます@AtnNn – Rbjz

関連する問題