本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
在 DynamoDB 中處理並行更新的最佳實務
在分散式系統中,多個程序或使用者可能會嘗試同時修改相同的資料。如果沒有並行控制,這些並行寫入可能會導致遺失更新、資料不一致或競爭條件。DynamoDB 提供多種機制,協助您管理並行存取和維護資料完整性。
注意
等個別寫入操作UpdateItem是原子的,無論並行為何,一律在項目的最新版本上運作。當您的應用程式必須讀取項目,然後根據讀取值 (read-modify-write週期) 將項目寫回時,需要鎖定策略,因為另一個程序可能會修改讀取和寫入之間的項目。
處理並行更新有兩種主要策略:
-
樂觀鎖定 – 假設衝突很少見。它允許並行存取,並使用條件式寫入偵測寫入時的衝突。如果偵測到衝突,寫入會失敗,應用程式可以重試。
-
冪等鎖定 – 假設可能發生衝突。它可透過在修改資源之前取得資源的專屬存取權來防止並行存取。其他程序必須等到鎖定釋放。
下表摘要說明 DynamoDB 中可用的方法:
| 方法 | Mechanism | 最適合 |
|---|---|---|
| 樂觀鎖定 | 版本屬性 + 條件式寫入 | 爭用性低、成本低廉的重試 |
| 預估鎖定 (交易) | TransactWriteItems |
多項目原子性、中度爭用 |
| 冪等鎖定 (鎖定用戶端) | 具有租用和活動訊號的專用鎖定資料表 | 長時間執行的工作流程、分散式協調 |
選擇並行控制策略
使用下列準則為您的工作負載選擇正確的方法:
- 在下列情況下使用樂觀鎖定:
-
衝突不常發生。
重試失敗的寫入並不昂貴。
您一次更新單一項目。
- 在下列情況下使用交易:
-
您需要以原子方式更新多個項目。
您需要跨項目all-or-nothing語意。
您需要在單一操作中結合條件檢查與寫入。
- 在下列情況下使用鎖定用戶端:
-
您需要協調跨分散式程序對外部資源的存取。
關鍵區段長時間執行,在衝突上重試非常昂貴。
您需要自動鎖定過期,才能處理程序失敗。
注意
如果您使用 DynamoDB 全域資料表,請注意全域資料表會使用「最後寫入器獲勝」對帳策略進行並行更新。具有版本號碼的樂觀鎖定在跨區域無法如預期運作,因為一個區域中的寫入可能會在沒有版本檢查的情況下覆寫另一個區域中的並行寫入。設計您的應用程式,以便在使用全域資料表時處理應用程式層級的衝突。