假设你有一个带有字段(列)的表作为主(分区)键(假设它的名字是“id”),其余的字段列是“常规”(没有聚类) - 让称它们为“field1”,“field2”,field3“,”field4“等。系统中当前存在的逻辑可能会为同一行生成2个单独的更新命令。例如:
UPDATE table SET field1='value1' WHERE id='key';
UPDATE table SET field2='value2' WHERE id='key';
这些命令在仲裁中一个接一个地运行。
很少,当您从数据库中检索行(仲裁读取)时,就好像其中一个更新没有发生。是否可能由于此写入模式而导致不一致,并且可以通过进行如下所示的一次更新调用来规避:
UPDATE table SET field1='value1',field2='value2' WHERE id='key';
这发生在Cassandra 2.1.17
上答案 0 :(得分:0)
是的,这完全有可能。
如果你在制作这两个陈述时需要保留订单,你可以做两件事:
using timestamp
添加到您的查询中并在客户端代码上明确设置 - 这样可以防止出现不一致答案 1 :(得分:0)
我要做的是改变表格定义
CREATE TABLE TABLE_NAME(
id text,
field text,
value text
PRIMARY KEY( id , field )
这样您就不必担心特定键字段的更新。
您的查询将是,
INSERT INTO TABLE_NAME (id , field , value ) VALUES ('key','fieldname1', 'value1' );
INSERT INTO TABLE_NAME (id , field , value ) VALUES ('key','fieldname2', 'value2' );
设计的缺点是,如果你的数据太多而无法使用,那就会产生宽行。
对于选择查询 -
SELECT * from TABLE_NAME where id ='key';
在客户端,构建您的对象。