4

我正在尝试使用 Cassandra cpp-driver 对批处理中的不同表执行 3 个条件插入:

BEGIN BATCH 
insert into table1 values (...) IF NOT EXISTS 
insert into table2 values (...) IF NOT EXISTS 
insert into table3 values (...) IF NOT EXISTS 
APPLY BATCH

但我收到以下错误:

Batch with conditions cannot span multiple tables

如果上述在 Cassandra 中是不可能的,那么执行多个条件插入作为事务并确保全部成功或全部失败的替代方法是什么?

4

1 回答 1

7

恐怕没有其他选择。环境中的条件语句BATCH仅限于单个表,我认为未来没有改变的空间。

这是由于 Cassandra 内部的工作方式:包含条件更新的批处理(称为轻量级事务)只能在一个分区中使用,因为它们基于 Paxos 实现,因为 Paxos 本身仅在分区级别工作。而且,在同一个BATCH中有多个条件语句的批处理中,必须验证所有条件才能批处理成功。即使一个(也是唯一一个)条件更新失败,整个批次也会失败。

您可以在文档中阅读有关BATCH语句的更多信息。

您基本上会因条件更新而受到性能影响,而批处理操作会受到性能影响,而 C* 会阻止您到目前为止。

在我看来,您将其设计为类似 RDBMS。一个 No-SQL 替代解决方案,我不知道它是否可以应用于您的用例,您可以在结合所有其他 3 个表的第 4 个表中对数据进行非规范化,然后为第 4 个表提供单个更新.

于 2016-12-06T14:03:31.740 回答