2017-10-06 29 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的關注,請隨時讓我知道。 –

相關問題