Cassandra批处理Insert执行顺序:MyKey最新记录是否确定?
问题解答
结论
MyKey的最新记录是批处理中最后一条语句对应的value(即示例中的value10),结果完全具有确定性。
原因分析
1. 表结构与查询逻辑
表的主键设计为(key, created_at),并指定CLUSTERING ORDER BY (created_at DESC),意味着同一key下的记录会按created_at(TIMEUUID)从大到小排序。查询语句SELECT * FROM data WHERE key = ? ORDER BY created_at DESC LIMIT 1的作用就是获取该key下created_at最大的那条记录。
2. 批处理中now()的执行逻辑
根据Cassandra对now()函数的定义:
now()
在Coordinator node中,语句执行时生成一个毫秒级的唯一TIMEUUID。TIMEUUID的时间戳部分符合UTC(协调世界时)标准。此方法适用于插入值,返回的值保证唯一。
当批处理发送到协调节点后,会按批处理内语句的书写顺序依次执行,每条语句中的now()会被逐个求值:
- 即使多条语句在同一毫秒内执行,
now()生成的TIMEUUID也会保证唯一且递增; - 批处理中后执行的语句(即最后一条)生成的TIMEUUID是这批中最大的。
3. 测试验证
实际测试结果显示,查询返回的始终是批处理最后一条语句的value,这与上述逻辑完全一致——最大的TIMEUUID对应最后一条插入的记录,在倒序聚类的表中会被优先返回。
附:相关代码与定义
表结构
CREATE TABLE IF NOT EXISTS data ( key TEXT, created_at TIMEUUID, value TEXT, PRIMARY KEY (key, created_at) ) WITH CLUSTERING ORDER BY (created_at DESC);
查询语句
SELECT * FROM data WHERE key = ? ORDER BY created_at DESC LIMIT 1
批处理示例
BEGIN BATCH INSERT INTO data (key, created_at, value) VALUES ('MyKey', now(), 'value1'); INSERT INTO data (key, created_at, value) VALUES ('MyKey', now(), 'value2'); .... INSERT INTO data (key, created_at, value) VALUES ('MyKey', now(), 'value10'); APPLY BATCH;
内容的提问来源于stack exchange,提问作者tainguyentt
相关产品推荐
相关产品推荐

