DynamoDB 是最終一致的嗎?
預設是。DynamoDB 的讀取是最終一致的:緊接在一次寫入之後的讀取可能不會反映那次寫入,但稍後再讀一次就會回傳最新的項目。你可以在資料表與 LSI 上選用強一致性讀取;全域次要索引則永遠是最終一致的。
最終一致性(預設)
一次最終一致性讀取可能不會反映一次剛完成的寫入。過一會兒再讀一次,它就會回傳目前的值。這個模式是預設,而它的計費是強一致性讀取的一半。
強一致性讀取
設定 ConsistentRead: true 就能取得最近一次已提交的資料(一次強一致性讀取)。基礎資料表與本地次要索引(LSI)支援這一項 — 但全域次要索引(GSI)與 DynamoDB Streams 不支援,它們永遠是最終一致的。
GSI 的這項排除是在 API 層強制執行的,不是留給你自己去遵守:對一個全域次要索引下 ConsistentRead: true 的 Query 會讓整個請求失敗,而不是悄悄把它降級(確切的拒絕內容)。
這個選擇要花多少錢
「半價」是文件記載的規則;以下是它換算出來的樣子。以 us-east-1、每秒 1,000 次 4 KB 項目的讀取,其他什麼都不算:
| 一致性 | 每次讀取的讀取單位 | 隨需/月 | 佈建/月 |
|---|---|---|---|
| 最終一致性 | 0.5 | $164.25 | $47.45(500 RCU) |
| 強一致性 | 1 | $328.50 | $94.90(1,000 RCU) |
輸入條件,好讓你能自己核對:一個 730 小時的月份有 2,628,000 秒、每百萬讀取請求單位 $0.125、每 RCU-小時 $0.00013。一個 4 KB 的項目是一個讀取單位,最終一致性時折半。
所以每月 $164 就是在這個工作負載上「永遠不讀到過期項目」的常設價碼。那對一個帳戶餘額來說很便宜,對一份商品清單來說則是浪費,這也是為什麼那個旗標是逐請求而不是逐資料表設定的。用定價計算機替你自己的數字標價。
為什麼會是這樣運作
DynamoDB 會自動把你的資料複寫到三個可用區域。最終一致性讓讀取不必等待每一份副本就能被服務 — 更快也更便宜;強一致性則回傳最新的資料。
那多區域(全域資料表)呢?
跨區域複寫有它自己的一致性設定。全域資料表預設是多區域最終一致性(MREC),變更通常會在一秒或更短的時間內複寫到其他區域。你也可以改為建立採用多區域強一致性(MRSC)的全域資料表:寫入會同步複寫到至少一個其他區域,而在任一個複本上的強一致性讀取,永遠會回傳某個項目的最新版本。
深入了解
閱讀 DynamoDB 一致性了解完整的取捨。下載 DynoTable 就能在你的查詢上切換讀取一致性。
參考資料
- DynamoDB read consistency — Amazon DynamoDB Developer Guide
- How DynamoDB global tables work — Amazon DynamoDB Developer Guide
- Query — Amazon DynamoDB API Reference
- What is Amazon DynamoDB? — Amazon DynamoDB Developer Guide
最後查證於 2026-07-13,對照上方連結的官方 AWS 文件;單價已於 2026-07-28 重新核對。
GSI 的那次拒絕已於 2026-07-28 透過 @aws-sdk/client-dynamodb 3.1095.0,對照 DynamoDB Local 3.3.0(amazon/dynamodb-local:latest)重現,而那張成本表是用計算機所使用的同一份定價資料計算出來的。