You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure Cosmos DB的_ts字段取值依据及相关查询一致性问题

关于Azure Cosmos DB _ts字段的核心问题解答

一、_ts字段的取值依据与时机

  • _ts是Cosmos DB自动生成的秒级Unix时间戳,取值完全绑定写入操作的最终提交时间——只有当创建/更新文档的操作在Cosmos DB集群层面完成持久化、确认提交的那一刻,系统才会把此时的UTC时间转换为秒级时间戳,赋值给该文档的_ts字段。
  • 划重点:_ts和客户端发起请求的时间、请求到达网关的时间都没关系,只认写入提交完成的那个时间点。

二、你的场景问题解答

先明确你的操作流程:

  1. 执行SELECT VALUE GetCurrentTimestamp()拿到当前时间戳作为@Timestamp
  2. 第一次执行SELECT * FROM c WHERE c._ts < @Timestamp
  3. 再次执行完全相同的查询

针对这个场景,第二次查询有可能会得到第一次查询时尚未提交的新结果,原因很直接:

  • GetCurrentTimestamp()返回的是Cosmos DB服务器执行该查询时的UTC时间戳(毫秒级,和_ts的秒级逻辑一致),但从你拿到这个时间戳到执行第一次查询的间隙里,可能有其他写入操作在进行——这些操作在你第一次查询时还没完成提交,所以它们的_ts还没被赋值(或者说提交时间还没落地),自然不会出现在第一次结果里。
  • 等你第二次执行查询时,那些之前没提交完的写入可能已经完成了提交,只要它们的提交时间仍小于你之前获取的@Timestamp,对应的文档就会被第二次查询命中,出现在结果里。

补充两个关键细节:

  • 如果两次查询间隔极短,那些未提交的写入可能还没跑完,第二次结果就和第一次完全一致;但只要间隔足够让写入完成提交,且提交时间仍在@Timestamp之前,就会出现新结果。
  • _ts的赋值是原子性的,只有写入彻底提交后才会有有效值,不存在“半提交”状态的_ts。

内容的提问来源于stack exchange,提问作者Travis Troyer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 07:35:55