假设我有以下的存储过程:
假设,从客户端应用程序中,我产生了多个同时运行同一存储过程的任务。
问题:
存储过程的两次或多次同时运行是否可能导致它返回类似的文档?或者它们会完全隔离吗?
Cosmos DB存储过程是否会锁定正在读取的数据?
观察到的结果:
所有任务都没有返回相同的文档,并且存储过程的返回始终是一组不同的文档。但我不确定这种行为是否一致。我尝试通过生成高达20的不同数量的任务来运行存储过程,但是不能观察到不一致。
答案 0 :(得分:2)
<强>问题强>:
存储过程的两次或多次同时运行是否可能导致它返回类似的文档?或者它们会完全隔离吗?
- 醇>
Cosmos DB存储过程是否会锁定正在读取的数据?
Cosmos DB保证ACID适用于属于单个存储过程的所有操作。
在Cosmos DB中,JavaScript与数据库位于相同的内存空间中。因此,在存储过程和触发器中进行的请求在数据库会话的相同范围内执行。这使Cosmos DB能够为所有属于单个存储过程/触发器的操作保证ACID。
您可以在此official doc中的数据库程序交易中找到上述说明。
<强>更新强>
存储过程的consistency level
由您设置的cosmos DB帐户的consistency level
确定,如官方文档中所述。
Cosmos DB提供five consistency levels。
我不确定您设置了哪个一致性级别,可能只是默认Session
一致性级别。
Session
一致性级别仅确保会话生命周期中的强一致性。
因此,您测试的存储过程不会同时运行。会有一些重叠。随后的更新将涵盖之前的更新。
解决方案:
您可以尝试将一致性级别更改为Strong
。它确保了最强的一致性,但增加了延迟。
或者您可以将transaction locks
添加到您的业务布局中,以确保一致性。
希望它对你有所帮助。
答案 1 :(得分:0)
根据MSDN,这听起来不正确:
数据一致性
存储过程和触发器始终在主数据库上执行 Azure Cosmos DB容器的副本。这样可以确保读取 内部存储过程提供了强大的一致性。查询使用 用户定义的函数可以在主数据库或任何辅助数据库上执行 副本,但是您可以通过以下方式确保满足要求的一致性级别 选择合适的副本。
https://docs.microsoft.com/en-us/azure/cosmos-db/programming#database-program-transactions