2012-03-07 12 views
2

同じクライアントタイムスタンプを持つ2つの更新の場合にどの書き込みが勝つかを知りたい。Cassandra - 同一のタイムスタンプを持つ混合列更新の競合解消

初期データ:KeyA: { col1:"val AA", col2:"val BB", col3:"val CC"}

クライアント1は、更新を送信します:KeyA: { col1:"val C1", col2:"val B1"}

クライアント2は、更新を送信します。KeyA: { col1:"val C2", col2:"val B2"}

どちらのアップデートが同じタイムスタンプを持っています。

KeyAの行クエリではどのような結果が返されますか?

  1. { col1:"val C1", col2:"val B1", col3:"val CC"} - クライアント2勝
  2. { col1:"val C2", col2:"val B1", col3:"val CC"} - - クリント1
  3. { col1:"val C2", col2:"val B2", col3:"val CC"}を獲得混合更新

I期待、その結果は予測不可能である - 両方の更新が同じタイムスタンプを有するからです。

シナリオも混在可能ですか?

答えて

4

タイムスタンプは、各列のプロパティであり、挿入全体ではありません。正確なタイムスタンプが同じ複数の列は、実際の列値自体を比較することによって解決されます。これは、値を字句的にバイト単位で比較することによって行われ、返される値は確定的です。

例では、両方のクライアントによって挿入されたすべての列が同じ正確なタイムスタンプを持つ場合、実際の列値の比較方法に応じて混合更新が表示されます。

+0

上記の混合更新はできませんが、クライアント2の列の値がより高いバイト値を持つためです。 –

+1

カッサンドラは、原子の書き込みと分離のレベルを提供しますが、これは、1)単一行の突然変異が全体として適用されるか、または拒絶されることのみを保証します2)突然変異はすべての列が書き込まれた後に見えます。しかし、同じタイムスタンプを持つ2番目の並列の突然変異が同じ列の他の値を格納する可能性があるため、1つの突然変異が1列に対して10列を格納しているという意味では、それらの10列すべてが読み込みクエリによって返されるわけではありません。右? –

+0

はい、あなたの例では、クライアント2からの値が返されます。また、行レベルの分離では、書込み中の列のタイムスタンプが最新のものでなければ、書込みからの値が返されることは保証されません。 – nickmbailey

1

ここには約Cassandra Timestampsと矛盾について書いた投稿へのリンクがあります。

+0

コレクションタイプの列はどのように競合しますか? – Ashish

関連する問題