異なるパーティション キーを持つ複数の行を Cassandra テーブルにアトミックに挿入する必要があります。同時に、クエリごとに、ユーザーが更新/挿入しているデータの状態が正しいことを確認する必要があります (競合状態の場合にデータが台無しにならないようにするため)。たとえば、db 構造は次のとおりです。
create table test(
id uuid,
userid uuid,
address text,
PRIMARY KEY ((id), userid)
);
行を挿入するときは、この PK がデータベースに存在しないことを確認する必要があります。誤ってデータを上書きしたくありません (Cassandra はそれを行うだけです)。そのために軽量なトランザクションが存在するので、IF NOT EXISTS
句を追加するだけで済みます。しかし、問題は、すべてが成功するか、どれも成功しないはずのそのような挿入がいくつかあることです。次の解決策は機能しません。
BEGIN BATCH
INSERT INTO test(id, userid, address) VALUES(50fcdfd9-7f61-11e5-9c9d-a0999b0af139, daf38231-eab1-4cd3-ae31-8d28d15c762b, 'addr1') IF NOT EXISTS;
INSERT INTO test(id, userid, address) VALUES(9c26fcc0-0f82-472c-8e83-01b90bed60cc, 0d1a91c4-780a-4bc6-9c12-f2976cb7b3ef, 'addr2') IF NOT EXISTS;
APPLY BATCH;
発行されたエラーは次のとおりBatch with conditions cannot span multiple partitions
です。ドキュメントは、回避策を提供せずにそれを言っています。データベース層でその種の原子性と一貫性を強制する方法はありますか? ACID の原則が Cassandra で保証されないことは理解していますが、なぜバッチ ステートメントの制限が警告ではなくエラーとして分類されるのかについての答えが見つかりません。この問題の回避策は何ですか?
Cassandraの哲学を理解するためのアイデアと助けをいただければ幸いです