如何确保我的 get 查询不会受到 COSMOS db 中长 运行 更新的影响?
How can I ensure my get query won't be affect by a long running update in COSMOS db?
我的容器有一组更新需要 10 秒以上(我最终会提高我的 RU 并希望这次有所改进)。
我的问题是我发现如果我在 10s+ 更新期间 运行 GET,我检索到的集合将包括一些更新的记录和一些尚未更新的记录。
如何确保我的 GET 不会检索到一组半更新的数据?
一些思路:
- 运行 查询 2x 并比较 e_tag 所有结果并确保没有更新发生(即 e_tag 没有任何记录发生变化),但这感觉就像一个非常大的(RU 昂贵的)hack。
- 确保我的更新 运行 作为单个 t运行saction(这在 COSMOS 中是如何完成的?通过 SPROC?)并锁定任何 GETS(但 COSMOS 不执行锁定,对吧?)
是否有我没有看到的更好的解决方案?
我将写入(createDocument / replaceDocument - 有趣的是我无法让 upsertDocument 工作)移动到存储过程中,这对性能非常有用(快 3 倍),
但是,在这些存储过程 运行 更新期间触发“GET”仍会导致半更新数据集
所以我也将“GET”移到了一个存储过程中,而且 Bingo!如果更新正在进行中,存储过程“GET”现在将return更新开始前的数据
来自docs:
存储过程和触发器始终在 Azure Cosmos 容器的主副本上执行。此功能确保从存储过程中读取提供强一致性
我的容器有一组更新需要 10 秒以上(我最终会提高我的 RU 并希望这次有所改进)。
我的问题是我发现如果我在 10s+ 更新期间 运行 GET,我检索到的集合将包括一些更新的记录和一些尚未更新的记录。
如何确保我的 GET 不会检索到一组半更新的数据?
一些思路:
- 运行 查询 2x 并比较 e_tag 所有结果并确保没有更新发生(即 e_tag 没有任何记录发生变化),但这感觉就像一个非常大的(RU 昂贵的)hack。
- 确保我的更新 运行 作为单个 t运行saction(这在 COSMOS 中是如何完成的?通过 SPROC?)并锁定任何 GETS(但 COSMOS 不执行锁定,对吧?)
是否有我没有看到的更好的解决方案?
我将写入(createDocument / replaceDocument - 有趣的是我无法让 upsertDocument 工作)移动到存储过程中,这对性能非常有用(快 3 倍),
但是,在这些存储过程 运行 更新期间触发“GET”仍会导致半更新数据集
所以我也将“GET”移到了一个存储过程中,而且 Bingo!如果更新正在进行中,存储过程“GET”现在将return更新开始前的数据
来自docs:
存储过程和触发器始终在 Azure Cosmos 容器的主副本上执行。此功能确保从存储过程中读取提供强一致性