在Cassandra中同时更新一行中的不同列
在Cassandra中,如果我同时更新一行中的不同列,是否会有写入冲突 例如,我有一张桌子在Cassandra中同时更新一行中的不同列,cassandra,cql,Cassandra,Cql,在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'). 当同时运行时,两个查询可能同时到达服务器
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将根据算法选择一个(不确定细节,我假设它涉及节点UUID) 所以写冲突不是你需要担心的事情。将这两个查询减少为一个查询将是正确的
当然,服务器与时间同步非常重要,否则可能会发生有趣的事情。谢谢您的回答。实际上,我不能100%确定时间戳是基于行还是基于列?如果是基于列的,那么并发写入不会有太多问题。Cassandra的数据存储中的所有内容都是基于列的。这样就不会有任何问题。因为每列都有自己的时间戳,一个线程只更新列a,另一个线程更新列b。这个论点正确吗?事实上,你能提供一些关于这种行为的参考/说明吗?非常感谢你。