Cosmos DB中的存储过程中的读取操作是否对数据进行了独占锁定?

时间:2017-10-06 18:21:33

标签: javascript azure azure-cosmosdb

假设我有以下的存储过程:

  1. 选择与条件匹配的前10条记录。比如说,选择TOP 10 * FROM c WHERE c.complete = false。
  2. 它会将所选的10个文档的完整标志更新为true。
  3. 替换这些具有更新标志的10个文档。
  4. 向客户返回这10个文件。
  5. 假设,从客户端应用程序中,我产生了多个同时运行同一存储过程的任务。

    问题:

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

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

    3. 观察到的结果:

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

2 个答案:

答案 0 :(得分:2)

  

<强>问题

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

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

  4.   

Cosmos DB保证ACID适用于属于单个存储过程的所有操作。

  

在Cosmos DB中,JavaScript与数据库位于相同的内存空间中。因此,在存储过程和触发器中进行的请求在数据库会话的相同范围内执行。这使Cosmos DB能够为所有属于单个存储过程/触发器的操作保证ACID。

您可以在此official doc中的数据库程序交易中找到上述说明。

<强>更新

存储过程的consistency level由您设置的cosmos DB帐户的consistency level确定,如官方文档中所述。

Cosmos DB提供five consistency levels

我不确定您设置了哪个一致性级别,可能只是默认Session一致性级别。

Session一致性级别仅确保会话生命周期中的强一致性。 因此,您测试的存储过程不会同时运行。会有一些重叠。随后的更新将涵盖之前的更新。

解决方案:

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

  2. 或者您可以将transaction locks添加到您的业务布局中,以确保一致性。

  3. 希望它对你有所帮助。

答案 1 :(得分:0)

根据MSDN,这听起来不正确:

  

数据一致性

     

存储过程和触发器始终在主数据库上执行   Azure Cosmos DB容器的副本。这样可以确保读取   内部存储过程提供了强大的一致性。查询使用   用户定义的函数可以在主数据库或任何辅助数据库上执行   副本,但是您可以通过以下方式确保满足要求的一致性级别   选择合适的副本。

https://docs.microsoft.com/en-us/azure/cosmos-db/programming#database-program-transactions