我们在单个列族的单个分区中有多个更新查询。像下面这样
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;
简而言之,最好的方法是什么。