我们在单个列家庭的单个分区中有多个更新查询。如下所示
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;
或相同的值将是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;
简而言之,这将是最好的方式。
答案 0 :(得分:3)
您正在使用单个分区批处理,因此所有内容都会进入单个分区。因此,您的所有更新都将合并并应用单个RowMutation 。
所以你的更新将被应用,没有批量日志,原子,孤立
答案 1 :(得分:3)
对于你的第一个问题(C *会将它作为单个陈述组合吗?)答案是肯定的。
单个分区批处理作为单行变异应用。
查看此链接了解详情: https://issues.apache.org/jira/browse/CASSANDRA-6737
对于你的第二个问题(将C *比较每一列(用户名,网址)值?)答案也是肯定的。
如您提供的link&#34的回答中所述;通过选择单元格的最大值来解决冲突"
因此,您可以以任何方式批量编写查询(在您的问题中给出)。 因为它最终将在内部转换为单个写入。