2017-10-06 47 views
1

假设我已经存储的过程,并执行以下操作:Cosmos DB中的存储过程中的读取操作是否对数据进行独占锁定?

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

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

问题:

  1. 是否有可能在存储过程的两个或多个同时运行可能会导致它返回类似文件?或者他们会完全孤立运行?

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

结果发现:

的任务没有返回相同的文档,并从存储过程返回总是一组不同的文件。但我不确定这种行为是否一致。我尝试通过产生不同数量的高达20的任务来运行存储过程,但无法观察到不一致性。

回答

1

问题

  1. 是否有可能在存储过程的两个或多个同时运行可能会导致它返回类似文件?或者他们会完全孤立运行?

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

宇宙DB保证酸是一个存储过程的一部分,所有的操作。

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

你会发现在这个official doc的从数据库程序交易上面的描述。

更新

存储过程的consistency level或触发由宇宙DB帐户,您设置的consistency level决定,作为正式文件中提出。

Cosmos DB offers five consistency levels

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

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

解决方案:

  1. 你可以试着改变你的一致性水平Strong。它确保最强的一致性,但增加了延迟。

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

希望它可以帮助你。

+0

我试着同时执行存储过程。它不会锁定数据。此前的通话并非真正平行。这是快照隔离,因此存储过程的两次运行会返回相同的记录。 – vmn

+0

谢谢Jay。我会尝试你所建议的。 – vmn

+0

@vmn Ok.Any的关注,请随时让我知道。 –