Cassandra批量插入异常:删除后重复执行批量插入无数据
Cassandra批量插入失败原因分析
核心问题出在Cassandra的时间戳版本优先级机制:
- 步骤2执行DELETE时,Cassandra会自动生成一条「墓碑(tombstone)」记录,这条墓碑的时间戳是执行删除操作时的当前系统时间,必然晚于你批量插入语句里固定的
16783871583(即使时间戳位数不完整,逻辑依然成立)。 - Cassandra处理数据时,始终以时间戳最大的版本作为有效数据。当你重复执行步骤1的批量插入时,指定的时间戳小于墓碑的时间戳,Cassandra会判定这条插入属于旧数据,不会覆盖墓碑,所以查询时无法返回该记录,表现为插入失败。
- 单条INSERT语句如果未手动指定TIMESTAMP,Cassandra会自动使用当前系统时间作为时间戳,这个时间戳比墓碑的时间戳大,因此能覆盖墓碑,数据可以正常插入并被查询到。
- 步骤2执行DELETE时,Cassandra会自动生成一条「墓碑(tombstone)」记录,这条墓碑的时间戳是执行删除操作时的当前系统时间,必然晚于你批量插入语句里固定的
验证方法:把批量插入语句里的TIMESTAMP改成比删除时间更大的值,比如:
BEGIN BATCH USING TIMESTAMP 1700000000000 INSERT INTO test.fruit (lastUpdateTime, name, color) VALUES (1678387158324,'apple','red'); APPLY BATCH;执行后就能正常插入记录。
内容的提问来源于stack exchange,提问作者Kyle Yuan
相关产品推荐
相关产品推荐

