2017-03-12 10 views
1

もし存在しない場合、同じパーティションの複数の行をバッチ挿入しています。私のテストでは、行のいずれかが重複していると、すべての挿入が失敗し、行が挿入されていないように見えます。私は存在しない場合の動作を維持したいが、重複があっても重複しない行を挿入するとバッチを失敗しないようにしたい。重複がある場合、バッチに失敗しないようにカッサンドラに伝える方法はありますか?Cassandraバッチが存在しない場合は重複動作

答えて

2

ご使用のバージョンのCassandraに適用される可能性が高い次の文書に注意してください。

Cassandra 2.0.6以降では、Cassandra 2.0で軽量トランザクションとして導入されたバッチ条件付きの更新が可能です。基本的なPaxosの実装は、パーティションの粒度で動作するため、同じパーティションに対して行われた更新のみをバッチに含めることができます。条件を持つ更新をグループ化することはできませんが、バッチ内の単一のステートメントが条件を使用する場合、バッチ全体がバッチ内のすべての条件が適用されるかのように、単一のPaxosプロポーザルを使用してコミットされます。

これは、意図した動作であることを確認します。基礎となるバッチの仕組みを考えると、CQLを使用して欲しいことを行うことは容易ではありません。

https://docs.datastax.com/en/cql/3.1/cql/cql_reference/batch_r.html#reference_ds_djf_xdd_xj__batch-conditional

あなたのユースケースの詳細を知らなくても、私の最初の考えは、あなたが本当にこのようなBATCHステートメントを使用する必要がある場合は質問することです。アプリケーションの1つのイベントに基づいて複数のテーブルを更新する必要がある場合でも、同じIF NOT EXISTS条件に基づいてステートメントをまとめてバッチ処理できます。

+0

私の使用例は簡単です。私は同じテーブルにデータを挿入する2つの別々のプロセスがあります。最初のプロセスAのデータは、他のプロセスBのデータよりも優先されます。プロセスBはまずテーブルから読み取り、挿入しようとしているデータが存在していないことを確認します。問題は、読み込みと書き込みの間のデータがプロセスAによって挿入された可能性があることです。これは、プロセスBがプロセスBのデータをプロセスAのデータを上書きするのを避けるために、存在しない場合に挿入を行います。 –

+1

意味があります軽量なトランザクション(存在しない場合)を使用するが、バッチステートメントを使用する必要があるのはなぜですか。 –

+0

私は実際には、既定のグループですべての同じパーティションキーの挿入を単一のバッチステートメントで行うSpark Cassandraコネクタを通じてこれを行っています。 –

関連する問題