Cassandra同主键多节点并发插入的WriteTime及一致性级别影响问询
Cassandra一致性级别对WriteTime的影响及写入行为解析
一、集群内部的写入过程
Cassandra的写入是基于单元格的追加式写入,不存在“直接跳过状态A写入状态B”的情况:
- 执行插入A时,会在对应副本节点的SSTable中持久化三个单元格的版本:
field_2=1(WriteTime为A的操作时间)、field_3=1(WriteTime为A的操作时间),以及主键field_1=1。 - 执行插入B时,由于语句中显式指定了
field_2=1(即使值和A一致),Cassandra会将其视为一次新的写入,在SSTable中追加field_2=1(WriteTime为B的操作时间)、field_3=2(WriteTime为B的操作时间)的新版本。 - 查询时,Cassandra会合并所有SSTable中的单元格版本,取每个字段最大WriteTime对应的版本作为结果,因此最终返回的是B操作写入的版本。
二、WriteTime相同的原因
你看到unchanged_cell和updated_cell的WriteTime相同,是因为B操作显式包含了field_2字段——只要INSERT语句中指定了某个字段,无论值是否变化,Cassandra都会为该字段生成一个新的单元格版本,并赋予当前操作的WriteTime,而非保留之前的版本时间。
三、一致性级别的影响
一致性级别(ONE/QUORUM/ALL)不会改变WriteTime的生成逻辑,它仅控制:
- 写入操作需要等待多少个副本节点确认持久化完成后,才向客户端返回成功。
- 查询操作需要从多少个副本节点拉取数据,才能合并出最终结果。
无论使用哪种一致性级别,只要INSERT语句包含了field_2,它的WriteTime都会被更新为B操作的时间,因此结果不会变化。
四、实现预期结果的方法
如果希望field_2保留A操作的WriteTime,执行B操作时不要包含field_2字段,仅更新需要修改的field_3:
INSERT INTO table1(field_1, field_3) VALUES (1, 2); -- B操作
此时查询WRITETIME(field_2)会得到A操作的时间,WRITETIME(field_3)得到B操作的时间,两者会出现预期的大小差异。
内容的提问来源于stack exchange,提问作者Ewen Bouquet
相关产品推荐
相关产品推荐

