2

異なるパーティション キーを持つ複数の行を 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の哲学を理解するためのアイデアと助けをいただければ幸いです

4

0 に答える 0