javascript - Cosmos DB 存储过程中的读取操作是否对数据采取排他锁?

标签 javascript azure azure-cosmosdb

假设我有执行以下操作的存储过程:

  1. 选择符合条件的前 10 条记录。就像说,选择 TOP 10 * FROM c WHERE c.complete=false。
  2. 它将所选 10 个文档的完整标志更新为 true。
  3. 替换这 10 个具有更新标志的文档。
  4. 将这 10 份文件返回给客户。

假设,我从客户端应用程序生成多个任务,这些任务都同时运行相同的存储过程。

问题:

  1. 两个或多个同时运行的存储过程是否可能导致它返回相似的文档?或者它们会完全隔离运行吗?

  2. Cosmos DB 存储过程是否锁定正在读取的数据?

观察到的结果:

没有任务返回相同的文档,并且存储过程的返回始终是一组不同的文档。但我不确定这种行为是否会保持一致。我尝试通过生成高达 20 个不同数量的任务来运行存储过程,但无法观察到不一致的情况。

最佳答案

Questions:

  1. 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?

  2. 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生命周期的强一致性。 因此,您测试的存储过程不是同时运行的。会有一些重叠。后续更新将覆盖之前的更新。

解决方案:

  1. 您可以尝试将一致性级别更改为。它保证了最强的一致性,但增加了延迟。

  2. 或者您可以在业务布局中添加事务锁以确保强一致性。

希望对您有帮助。

关于javascript - Cosmos DB 存储过程中的读取操作是否对数据采取排他锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46611782/

相关文章:

asp.net - 与 ASP.NET Web 应用程序关联的 Azure WebJob 无法从 WebJob 访问用户角色

azure - AWS SimpleDb与Azure DocumentDb有何不同?两者与ElasticSearch有何不同

Azure Cosmos DB 相关子查询未按预期工作

javascript - 在调整大小时更改元素的高度

javascript - devise token auth - 如何使用javascript访问响应头信息?

javascript - 主干验证返回属性名称

javascript - 在没有服务器端脚本的情况下将 JSON 加载到本地 JavaScript 变量中?

azure - 逻辑应用中的筛选查询 (OData)

reactjs - Azure 上的 React 应用程序中未填充 Process.Env

azure-cosmosdb - 在 Azure 搜索中,如何使用多个术语运行 "contains"搜索?