【问题标题】:Update Different Columns in One Row Concurrently in Cassandra在 Cassandra 中同时更新一行中的不同列
【发布时间】:2015-10-04 02:56:29
【问题描述】:

在Cassandra中,如果我在一行中同时更新不同的列,会不会出现写冲突?

例如我有一张桌子

CREATE TABLE foo (k text, a text, b text, PRIMARY KEY (k))

我的代码更新专栏中的一个线程a

INSERT INTO foo (k, a) VALUES ('hello', 'foo')

而其他线程更新列b

INSERT INTO foo (k, b) VALUES ('hello', 'bar').

并发运行时,两个查询有可能同时到达服务器。

当我在一个 CQL 中更新两列时,我是否总是期望得到相同的结果?

INSERT INTO foo(k, a, b) VALUES ('hello', 'foo', 'bar')

会有写冲突吗?每个插入都是原子的吗?


正如 Tom 在回复中提到的,在 Cassandra 中,所有操作都是基于列的。然后每一列都应该有一个时间戳。在这种情况下,上述场景不会带来任何麻烦,因为一个线程只会更新列a,而另一个线程只会更新列b。我的理解正确吗?

谢谢!

【问题讨论】:

    标签: cassandra cql


    【解决方案1】:

    通过让每个服务器跟踪写入时间来解决写入冲突。如果它们准确同时到达(精确到毫秒)Cassandra 将根据算法选择一个(不确定细节,我假设它涉及节点 UUID)。

    因此,您无需担心写入冲突。将这两个查询减少为一个查询会做正确的事情。

    当然,服务器与时间同步非常重要,否则可能会发生有趣的事情。

    【讨论】:

    • 感谢您的回答。实际上,我不是 100% 确定时间戳是基于行还是基于列?如果是基于列的,并发写不会有太大问题。
    • Cassandra 数据存储中的所有内容都是基于列的。
    • 那么就没有问题了。由于每一列都有自己的时间戳,一个线程只会更新 a 列,另一列 b。这个论点合理吗?实际上,您能否提供一些有关此行为的参考/规范?非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2016-04-08
    • 2017-10-18
    • 1970-01-01
    • 2023-01-11
    • 1970-01-01
    • 2018-12-29
    • 2021-06-24
    • 2017-05-08
    相关资源
    最近更新 更多