在 Cassandra 中同时更新一行中的不同列

Update Different Columns in One Row Concurrently in Cassandra

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

例如我有一个table

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。我的理解正确吗?

谢谢!

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

所以写冲突不是你需要担心的事情。将这两个查询减少为一个查询会做正确的事情。

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