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

问题描述 投票:3回答:2

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

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将始终相同并且是必填字段。但根据给出的信息,将有额外的列。

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

按照Doc

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;

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

cassandra cq5 cassandra-2.0
2个回答
3
投票

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

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

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

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

正如您提供的link答案所示“冲突通过选择最大的细胞值来解决”

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


3
投票

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

因此,您的更新将应用于没有批处理日志,原子,隔离

© www.soinside.com 2019 - 2024. All rights reserved.