Azure Cosmos DB的_ts字段取值依据及相关查询一致性问题
关于Azure Cosmos DB _ts字段的核心问题解答
一、_ts字段的取值依据与时机
- _ts是Cosmos DB自动生成的秒级Unix时间戳,取值完全绑定写入操作的最终提交时间——只有当创建/更新文档的操作在Cosmos DB集群层面完成持久化、确认提交的那一刻,系统才会把此时的UTC时间转换为秒级时间戳,赋值给该文档的_ts字段。
- 划重点:_ts和客户端发起请求的时间、请求到达网关的时间都没关系,只认写入提交完成的那个时间点。
二、你的场景问题解答
先明确你的操作流程:
- 执行
SELECT VALUE GetCurrentTimestamp()拿到当前时间戳作为@Timestamp - 第一次执行
SELECT * FROM c WHERE c._ts < @Timestamp - 再次执行完全相同的查询
针对这个场景,第二次查询有可能会得到第一次查询时尚未提交的新结果,原因很直接:
GetCurrentTimestamp()返回的是Cosmos DB服务器执行该查询时的UTC时间戳(毫秒级,和_ts的秒级逻辑一致),但从你拿到这个时间戳到执行第一次查询的间隙里,可能有其他写入操作在进行——这些操作在你第一次查询时还没完成提交,所以它们的_ts还没被赋值(或者说提交时间还没落地),自然不会出现在第一次结果里。- 等你第二次执行查询时,那些之前没提交完的写入可能已经完成了提交,只要它们的提交时间仍小于你之前获取的
@Timestamp,对应的文档就会被第二次查询命中,出现在结果里。
补充两个关键细节:
- 如果两次查询间隔极短,那些未提交的写入可能还没跑完,第二次结果就和第一次完全一致;但只要间隔足够让写入完成提交,且提交时间仍在
@Timestamp之前,就会出现新结果。 - _ts的赋值是原子性的,只有写入彻底提交后才会有有效值,不存在“半提交”状态的_ts。
内容的提问来源于stack exchange,提问作者Travis Troyer
相关产品推荐
相关产品推荐

