Cassandra中的单个分区批处理如何用于多列更新?

时间:2016-08-24 10:42:39

标签: cassandra cq5 cassandra-2.0

我们在单个列家庭的单个分区中有多个更新查询。如下所示

update t1 set username = 'abc', url = 'www.something.com', age = ? where userid = 100;
update t1 set username = 'abc', url = 'www.something.com', weight = ? where userid = 100;
update t1 set username = 'abc', url = 'www.something.com', height = ? where userid = 100;

usernameurl将始终相同且是必填字段。但根据给出的信息,将有额外的列。

由于这是一个单独的分区操作,我们需要原子性+隔离。我们将批量执行此操作。

根据文件

  

BATCH语句将多个数据修改语言(DML)语句(INSERT,UPDATE,DELETE)组合到一个逻辑操作中,并为批处理中的语句写入的所有列设置客户端提供的时间戳。

现在我们要在多个语句中更新具有相同值的列(用户名,url),C *会在执行它之前将其组合为单个语句,如

update t1 set username = 'abc', url = 'www.something.com', age = ?, weight = ?, height = ? where userid = 100;

或相同的值将是upsert?

另一个问题是,因为它们都具有相同的时间戳,C *如何解决该冲突。 C *会比较每一列(用户名,网址)值。

  

因为它们都具有相同的时间戳C *通过选择单元格的最大值来解决冲突。 Atomic Batch in Cassandra

或者我们应该批量添加查询,如下所示。在这种情况下,我们必须检查用户名,url已经在声明中添加。

update t1 set username = 'abc', url = 'www.something.com', age = ? where userid = 100;
update t1 set weight = ? where userid = 100;
update t1 set height = ? where userid = 100;

简而言之,这将是最好的方式。

2 个答案:

答案 0 :(得分:3)

您正在使用单个分区批处理,因此所有内容都会进入单个分区。因此,您的所有更新都将合并并应用单个RowMutation

所以你的更新将被应用,没有批量日志,原子,孤立

答案 1 :(得分:3)

对于你的第一个问题(C *会将它作为单个陈述组合吗?)答案是肯定的。

单个分区批处理作为单行变异应用。

查看此链接了解详情: https://issues.apache.org/jira/browse/CASSANDRA-6737

对于你的第二个问题(将C *比较每一列(用户名,网址)值?)答案也是肯定的。

如您提供的link&#34的回答中所述;通过选择单元格的最大值来解决冲突"

因此,您可以以任何方式批量编写查询(在您的问题中给出)。 因为它最终将在内部转换为单个写入。