在傳統的關系資料庫上,為了防止 Last Writer wins 的情況,更新通常是這樣完成的:
update MyTable
set myColumn = @newValue,
version=version 1
where myPk = @pk and version = @versionObtainedPreviously
如何使用 Azure 表存盤實作類似的行為?
uj5u.com熱心網友回復:
Azure 表存盤中的樂觀并發是通過ETag物體上的屬性處理的。任何時候更新物體,其 ETag 值都會更改。
使用樂觀并發更新物體的程序類似于以下內容:
- 您從表中獲取物體。
- 您在客戶端對物體進行更改(比如增加
version屬性)。 - 您將更新請求發送到 Table Storage。發送更新請求時,您需要包含所獲取物體的 ETag 值。
當更新請求中包含 ETag 值時,Table Storage 會將該值與物體的當前 ETag 值進行比較。
如果兩者相同,則表示物體自獲取后尚未更新,可以進行更新。
如果值不同,則表存盤回傳Pre Condition failed (412)錯誤。在這種情況下,您將需要再次獲取物體并重復該程序。
從此link:
物體的 ETag 為更新操作提供默認的樂觀并發。ETag 值是不透明的,不應被讀取或依賴。在更新操作發生之前,表服務會驗證物體的當前 ETag 值是否與 If-Match 標頭中更新請求中包含的 ETag 值相同。如果值相同,則表服務確定該物體自檢索以來未被修改,然后更新操作繼續進行。
如果物體的 ETag 與更新請求指定的不同,更新操作將失敗,狀態碼為 412(前提條件失敗)。此錯誤表明物體自檢索以來已在服務器上更改。要解決此錯誤,請再次檢索物體并重新發出請求。
要強制執行無條件更新操作,請將 If-Match 標頭的值設定為請求中的通配符 (*)。將此值傳遞給操作將覆寫默認的樂觀并發并忽略 ETag 值中的任何不匹配。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/379590.html
