我需要在具有不同分区键的 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
。文档只是这么说,但没有提供解决方法。有没有办法在数据库层强制执行这种原子性和一致性?我知道 Cassandra 不能保证 ACID 原则,但我找不到答案,为什么批处理语句的限制被归类为错误而不是警告?什么可以作为解决此问题的方法?
任何有助于理解 Cassandra 哲学的想法和帮助将不胜感激