Cassandra 中的单分区批处理如何实现多列更新?

2024-04-04

我们在单个列族的单个分区中有多个更新查询。像下面这样

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;

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

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

根据文件

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

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

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

或者相同的值将被更新?

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

由于它们都具有相同的时间戳,C* 通过选择单元格的最大值来解决冲突。Cassandra 中的原子批处理 https://stackoverflow.com/questions/30572831/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;

简而言之,最好的方法是什么。


对于你的第一个问题(C* 会将其合并为单个语句吗?),答案是肯定的。

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

检查此链接了解详细信息:https://issues.apache.org/jira/browse/CASSANDRA-6737 https://issues.apache.org/jira/browse/CASSANDRA-6737

对于你的第二个问题(C* 会比较每一列(用户名、url)值吗?)答案也是肯定的。

正如您所提供的答案中所给出的link https://stackoverflow.com/a/30579176/6752274“通过选择单元格的最大值来解决冲突”

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Cassandra 中的单分区批处理如何实现多列更新? 的相关文章

随机推荐