我正在使用cassandra 2.2.3并希望使用两个语句进行批量更新。两者都使用轻量级事务。
BEGIN BATCH
UPDATE account SET values['balance'] = 11 WHERE id = 1 IF values['balance'] = 10;
UPDATE account SET values['balance'] = 11 WHERE id = 2 IF values['balance'] = 10;
APPLY BATCH;
批处理返回以下错误:
InvalidRequest: code=2200 [Invalid query] message="Batch with conditions cannot span multiple partitions".
据我所知,由于分区的原因,不可能在where子句中的各种PK上进行批处理,但是为什么不能在同一个PK上进行批处理?问题是IF语句,删除它们,批处理工作。
那么是否有成功执行批量更新的解决方案?或任何解决方法?
编辑: 这是我的架构:
CREATE TABLE booking.account (
id int PRIMARY KEY,
values map<varchar, decimal>,
timestampCreate timestamp,
timestampUpdate timestamp
);
答案 0 :(得分:2)
据我所知,不可能在各种PK上制作批次 where子句因为分区,但为什么不可能 在同一个PK上做批处理?
您可以在where子句中对各种PK进行批处理,但不建议这样做(请参阅Cassandra: Batch loading without the Batch keyword)。
这里的问题是条件更新(if语句)。引自datastax cql reference。
在Cassandra 2.0.6及更高版本中,您可以批量处理条件更新 在Cassandra 2.0中作为轻量级事务引入。只有更新 因为同一个分区可以包含在批处理中 底层的Paxos实现工作在粒度上 划分。您可以将具有条件的更新分组 不要,但当批处理中的单个语句使用条件时, 使用单个Paxos提案提交整个批次,就好像所有提案一样 批次中包含的条件适用。
那你真的需要批量陈述吗?阅读此Using and misusing batches