ReplicatedWriteConflictException
TL;DR — 你在一個多 Region 強一致(MRSC)global table** 中寫入某項目時,另一個 Region 的請求正在修改同一項目。強多 Region 一致性不能讓兩個都獲勝落地,因此一個寫入被拒絕。AWS 記載它為可重試:退避並重試,並在你能做到之處減少對熱項目的跨 Region 爭用。**
這是什麼意思
ReplicatedWriteConflictException: One or more items in this request are
being modified by a request in another Region.傳統(最終一致)global table 到處接受並行寫入,並事後以最後寫入者獲勝來調解。MRSC global table 做出相反的取捨:寫入在被確認前必須跨 Region 協調,因此兩個 Region 在同一刻修改同一項目是真正的衝突 — 而一方會得到這個例外,而非默默覆寫。
為什麼會發生
- 同一項目同時從多個 Region 寫入 — 兩個應用部署都把該項目當作自己該更新的。
- 熱協調項目 — 計數器、鎖,或被每個 Region 觸及的單例設定項目,是天然的衝突磁鐵。
- 跨 Region 的重試風暴 — 來自不同 Region 對同一邏輯操作的同時重試持續重新碰撞。
如何修正
以指數退避與抖動重試 — 衝突是短暫的;一旦另一個 Region 的寫入完成,重試便繼續。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; }給項目一個家 Region — 將給定鍵的寫入透過一個 Region 路由(依使用者居住地、租戶或 partition),讓其他 Region 大多唯讀。當只有一個 Region 變更項目時,爭用便消失。
讓並行更新可交換 — 對個別屬性的原子計數器更新(
ADD/SET x = x + :n)比對整個項目的讀-改-寫循環衝突更少。輸掉競爭後重新檢查意圖 — 另一個 Region 改變了項目;一個條件式重試(對版本屬性的
ConditionExpression)確保你的寫入對新狀態仍然有效。
當資料擺在眼前時,觀察項目跨 Region 的變化容易得多 — DynoTable 桌面應用程式連到每個複本 Region,讓你能並排比較項目,而 DynamoDB 定價計算器估算複製寫入的成本。
相關錯誤
- TransactionConflictException — 單 Region 表親:進行中的交易占用該項目。
- Global table version mismatch
- ReplicaAlreadyExistsException
- 學習:DynamoDB global tables
References
- 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 官方文件。