在 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)。
所以写冲突不是你需要担心的事情。将这两个查询减少为一个查询会做正确的事情。
当然,你的服务器与他们的时间同步是非常重要的,否则可能会发生有趣的事情。
在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)。
所以写冲突不是你需要担心的事情。将这两个查询减少为一个查询会做正确的事情。
当然,你的服务器与他们的时间同步是非常重要的,否则可能会发生有趣的事情。