首页 文章

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

提问于
浏览
0

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

    是的,这是完全可能的 .

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

    • using timestamp 添加到您的查询并在客户端代码上明确设置 - 这将防止不一致

    • 使用批次

  • 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' );
    

    设计的缺点是,如果你有太多的'key'数据,它会创建宽行 .

    对于选择查询 -

    SELECT * from TABLE_NAME where id ='key';
    

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

相关问题