2016-04-05 22 views
0

我想了解在使用會話一致性時DocumentDB提供的確切保證。DocumentDB上的會話保證

是否有可能爲以下情況發生(讓我們假設A,B,C,d相同文檔的所有值)

會話1 W(A)W(B)

會話2 .................. W(c)W(d)

第3節.................. ............... R(b)R(c)

第4節............................................. ........... R(c)R(b)

I換句話說,是跨會話順序寫入的(在這種情況下,b發生在c或c發生在b之前,因此C3或C4中的一個會違反單調讀取)?

應用更新a,b,c,d(假設它們全部由會話一致性制定)的順序是什麼?

+0

C1,C2等代表什麼?他們是不同的「客戶」?會話一致性意味着對於給定的會話,數據庫將顯示一致,準備好您自己的寫入/單調。但是,從另一個環節來看,它們可能完全出現故障。在你的例子中,你在寫入之後進行讀取,所以這可能不適用,但是如果你在讀取之後寫入,你可以使用Etag樂觀併發功能來確定文件沒有在兩者之間更新。另外,如果將所有讀取和寫入操作合併到存儲過程中,則它們完全是ACID事務處理。 –

+0

是的,代表不同的客戶。最新的更新順序是否有任何保證? (假設在我展示的內容之後沒有更新的更新,最終狀態是d還是b?)。 我不確定我對etags有什麼看法。 etags具有強大的一致性,但寫入是異步發生的。說,我讀了r(a)然後想寫w(c),並不能保證寫(b)正在傳輸中,並且會在我的讀(a)和寫(b)之間應用,對嗎? (當我第一次申請w(b)時,文件仍然有價值,所以etag檢查不會失敗)。 – user1018513

+0

「說,我讀了r(a)然後想寫w(c),但不能保證寫(b)在傳輸中,並且會在我讀(a)和寫(b)之間應用,對不對?如果在讀取(a)和寫入(c)之間發生寫入(b)並使用Etags,則可以保證寫入(c)將失敗。 –

回答

2

會話一致性爲用戶提供以下保證。

1)閱讀您自己的寫 - 會話內部執行的任何寫入操作都會在會話中立即顯示。

2)單調讀取 - 在會話中看到的任何讀取都不會在會話中退化。

假設A,B,C,D是相同文檔的增加版本。

C,B不是單調遞增的歷史記錄,並且會違反會話保證。

注意:這裏的假設是會話(4)的讀取請求是以串行順序發出的。即第一次讀取完成後發出第二次讀取。

+0

B和C由不同的客戶編寫。它仍然有效嗎?這是否意味着我可以認爲所有的寫作都將通過一個主要的? 當你的意思是「倒退」時,你的意思是對於我自己的寫作或文檔中寫入的總順序(這裏是A,B,C,D,即使A,B,C,D都不是' t由會話4編寫) – user1018513

+0

是的,無論哪個會話執行寫入操作,您都將在* every *會話中看到單調的讀取保證。 –

+0

這是否也適用於同一集合中的所有文檔? 如果客戶端1寫入文檔A的版本1,則寫入文檔b的版本1:如果客戶端2隨後讀取文檔B的版本1,是否也會保證看到文檔A的版本1? (在文檔,集合或數據庫級別保證會話保證?) – user1018513