【问题标题】:batch update cassandra with lightweight transaction使用轻量级事务批量更新 cassandra
【发布时间】:2015-12-03 14:44:58
【问题描述】:

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

【问题讨论】:

  • 你能显示表格架构吗?
  • 我将架构添加到帖子中。谢谢

标签: cassandra


【解决方案1】:

我了解无法对不同的 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

【讨论】:

  • 感谢您的链接。我使用批处理的目的是对两个帐户进行相同的“预订”,并且要么全部成功执行,要么都不成功。我的意思是结合使用 CAS 和批处理将是一个很好的组合。
  • 是的,我认为不会有其他解决方案。这是两阶段提交的一个很好的链接(在 mongoDB 中)api.mongodb.org/wiki/current/two-phase%20commit.html 我会尝试的。谢谢