ReplicatedWriteConflictException
TL;DR — 你在一張多區域強一致(MRSC)全域性表上寫入了一個項目,而_另一個區域_的一個請求正在修改同一個項目。多區域強一致不能讓兩個寫入都落地,因此一個寫入被拒絕。AWS 記載它可重試:退避並重試,並儘可能減少熱點項目上的跨區域爭用。
這是什麼意思
ReplicatedWriteConflictException: One or more items in this request are
being modified by a request in another Region.經典(最終一致)全域性表在各處接受並行寫入,並事後以後寫者勝出進行調和。MRSC 全域性表做出相反的權衡:一次寫入必須在被確認之前跨區域協調,因此兩個區域在同一時刻修改同一個項目是一個真正的衝突——其中一方會得到這個異常,而不是一次靜默覆蓋。
為什麼會發生
- 同一個項目從多個區域並行寫入——兩個應用部署都把該項目當作自己該更新的。
- 一個熱點協調項目——計數器、鎖或被每個區域觸及的單例配置項目是天然的衝突磁石。
- 跨區域的重試風暴——來自不同區域的同一邏輯操作的同時重試不斷重新碰撞。
如何修正
用指數退避加抖動重試——衝突是短暫的;一旦另一個區域的寫入完成,重試就會進行。AWS 把這個錯誤標記為可重試:
// let the SDK's adaptive retry handle it, or catch and back off: catch (e) { if (e.name === 'ReplicatedWriteConflictException') return retryWithBackoff(op); throw e; }給項目一個歸屬區域——把某個鍵的寫入透過一個區域路由(按使用者駐留地、租戶或分割槽),讓其他區域以讀為主。當只有一個區域改動一個項目時,爭用就消失了。
讓並行更新可交換——在不同屬性上的原子計數器更新(
ADD/SET x = x + :n)比對整個項目的讀-改-寫迴圈更少衝突。輸掉競速後重新檢查意圖——另一個區域改動了該項目;一次條件重試(在一個版本屬性上的
ConditionExpression)確保你的寫入相對新狀態仍然有效。
當資料擺在你眼前時,觀察一個項目跨區域的變化會容易得多——DynoTable 桌面應用連線到每個副本區域,讓你能並排比較項目,而 DynamoDB 定價計算器會估算複製寫入的成本。
在 DynoTable 中檢查
衝突後跨 Region 比較相同的項目 — 使用 ⌘P 切換,使用 ⌘K 開啟表,並排讀取每個副本 Region 中的項目。暫存 (⌘S) 允許你準備條件重試並在提交之前檢查差異。在熱表上啟用 MRSC 之前,使用 pricing calculator 估算複製寫入成本。在“設定”→“設定檔案”下使用 Test Connection 配置每個區域。參見連線 AWS和安裝。
來源
- How DynamoDB global tables work(2026-07-13 驗證)
- Error handling with DynamoDB(2026-07-13 驗證)
相關錯誤
- TransactionConflictException——單區域的表親:一個進行中的事務佔有該項目。
- 全域性表版本不匹配
- ReplicaAlreadyExistsException
- 學習:DynamoDB global tables
參考資料
- Error handling with DynamoDB — Amazon DynamoDB Developer Guide
- How DynamoDB global tables work — Amazon DynamoDB Developer Guide
- PutItem — Amazon DynamoDB API Reference
最後核實於 2026-07-13,依據上方連結的 AWS 官方文件。