假设我有执行以下操作的存储过程:
- 选择符合条件的前 10 条记录。就像说,选择 TOP 10 * FROM c WHERE c.complete=false。
- 它将所选 10 个文档的完整标志更新为 true。
- 替换这 10 个具有更新标志的文档。
- 将这 10 份文件返回给客户。
假设,我从客户端应用程序生成多个任务,这些任务都同时运行相同的存储过程。
问题:
两个或多个同时运行的存储过程是否可能导致它返回相似的文档?或者它们会完全隔离运行吗?
Cosmos DB 存储过程是否锁定正在读取的数据?
观察到的结果:
没有任务返回相同的文档,并且存储过程的返回始终是一组不同的文档。但我不确定这种行为是否会保持一致。我尝试通过生成高达 20 个不同数量的任务来运行存储过程,但无法观察到不一致的情况。
最佳答案
Questions:
Is it possible that the two or more simultaneous run of the stored procedure can cause it to return similar documents? Or will they run in complete isolation?
Does Cosmos DB stored procedure lock the data being read?
Cosmos DB 保证单个存储过程中所有操作的 ACID。
In Cosmos DB, JavaScript is hosted in the same memory space as the database. Hence, requests made within stored procedures and triggers execute in the same scope of a database session. This enables Cosmos DB to guarantee ACID for all operations that are part of a single stored procedure/trigger.
您可以在 official doc 中的数据库程序事务中找到上述描述。 .
更新
存储过程或触发器的一致性级别
由您设置的cosmos DB帐户的一致性级别
决定,官方文档中有说明。
Cosmos DB 优惠 five consistency levels .
我不确定您设置了哪个一致性级别,可能只是默认的Session
一致性级别。
Session
一致性级别仅保证Session生命周期的强一致性。
因此,您测试的存储过程不是同时运行的。会有一些重叠。后续更新将覆盖之前的更新。
解决方案:
您可以尝试将一致性级别更改为
强
。它保证了最强的一致性,但增加了延迟。或者您可以在业务布局中添加
事务锁
以确保强一致性。
希望对您有帮助。
关于javascript - Cosmos DB 存储过程中的读取操作是否对数据采取排他锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46611782/