可以对Cassandra中连续不同字段的连续更新导致不一致吗?

时间:2017-03-27 19:20:08

标签: cassandra

假设你有一个带有字段(列)的表作为主(分区)键(假设它的名字是“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

2 个答案:

答案 0 :(得分:0)

是的,这完全有可能。

如果你在制作这两个陈述时需要保留订单,你可以做两件事:

  1. using timestamp添加到您的查询中并在客户端代码上明确设置 - 这样可以防止出现不一致
  2. 使用批次

答案 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';

在客户端,构建您的对象。