使用轻量级事务批量更新cassandra

时间:2015-12-02 13:07:25

标签: cassandra

我正在使用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
);

1 个答案:

答案 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