【发布时间】:2017-08-02 21:55:35
【问题描述】:
我正在使用 if not exists 为同一分区批量插入多行。从我的测试来看,如果任何行是重复的,那么所有插入都会失败并且没有插入任何行。我想保留 if not exists 行为,但如果存在重复项并且仍然插入非重复行,则不会使批处理失败。如果有重复,有什么方法可以告诉 Cassandra 不要使批处理失败?
【问题讨论】:
标签: cassandra
我正在使用 if not exists 为同一分区批量插入多行。从我的测试来看,如果任何行是重复的,那么所有插入都会失败并且没有插入任何行。我想保留 if not exists 行为,但如果存在重复项并且仍然插入非重复行,则不会使批处理失败。如果有重复,有什么方法可以告诉 Cassandra 不要使批处理失败?
【问题讨论】:
标签: cassandra
请注意以下最有可能适用于您的 Cassandra 版本的文档。
在 Cassandra 2.0.6 及更高版本中,您可以批量在 Cassandra 2.0 中作为轻量级事务引入的条件更新。只有对同一分区所做的更新才能包含在批处理中,因为底层 Paxos 实现在分区的粒度上工作。您可以将具有条件的更新与没有条件的更新分组,但是当批处理中的单个语句使用条件时,整个批处理将使用单个 Paxos 提议提交,就好像批处理中包含的所有条件都适用一样。
这确认您所遇到的行为是预期的行为。鉴于底层的批处理机制,通过 CQL 做你想做的事情并不容易。
在不知道您的用例细节的情况下,我最初的想法是质疑您是否真的需要使用这样的 BATCH 语句。如果您需要根据应用程序中的一个事件更新多个表,您仍然可以根据相同的 IF NOT EXISTS 条件将语句批处理在一起。
【讨论】: