DynamoDB 符合 ACID 嗎?

符合。DynamoDB 透過 TransactWriteItemsTransactGetItems 這兩套 API 支援 ACID 交易。它們會把最多 100 個動作組成單一次全有全無的操作,並在單一個 AWS 區域內提供不可分割性、一致性、隔離性與持久性保證。單一項目的寫入本身也是不可分割且持久的,但多項目的 ACID 就需要交易 API。

ACID 在這裡是什麼意思

一筆 DynamoDB 交易要嘛套用每一個動作、要嘛一個都不套用(不可分割性),讓資料留在有效狀態(一致性),與並行的交易彼此隔離(隔離性),而且一旦回傳成功就已持久提交(持久性)。這些保證在交易 API 被呼叫的那個 AWS 區域內成立。

兩套交易 API

  • TransactWriteItems — 一次同步且具冪等性的寫入,批次處理 PutUpdateDeleteConditionCheck 動作。
  • TransactGetItems — 對多個項目做一次不可分割、一致的讀取。

你不能在一筆交易中對同一個項目下手兩次。

上限是 100,不是 25

API 參考文件說 TransactWriteItems "groups up to 100 action requests",而且 "the aggregate size of the items in the transaction cannot exceed 4 MB"(2026-07-28 取得)。這個數字在 2022 年之前是 25,而那個過時的數字至今仍被廣泛複述,所以值得去查 API 文件而不是某篇部落格。

100 個動作的交易會被接受。101 個的就會被回絕:

ValidationException: Member must have length less than or equal to 100

請注意那則訊息裡沒有的東西:「transaction」這個字。它是一個泛用的陣列長度抱怨,所以在記錄裡搜尋交易錯誤時根本不會冒出來。批次 API 就沒那麼含蓄了。BatchGetItem 帶 101 個索引鍵會回 Too many items requested for the BatchGetItem call,而 BatchWriteItem 帶 26 筆則會回同一個句型、換上它自己的名字。

對同一個項目下手兩次同樣會失敗,即使每個動作單獨執行都會成功:

ValidationException: Transaction request cannot include multiple operations on one item

這一個專門逮那種從進來的事件迴圈組出動作清單、卻沒有先依索引鍵去重的程式碼。

交易也是雙倍計費。以交易方式寫入 100 個 1 KB 的項目會消耗 200 個寫入單位,而同樣這些項目個別寫入是 100 個,所以就算什麼都沒失敗,不可分割性一樣有代價。

全域資料表呢?

一筆交易只在它被呼叫的那個區域裡符合 ACID。在使用預設多區域最終一致性(MREC)模式的全域資料表上,交易式寫入不會被當成一個單位複寫 — 在變更傳播期間,另一個區域可能短暫看到一筆只複寫了一半的交易。設定為多區域強一致性(MRSC)的全域資料表則根本不支援交易 API。

深入了解

DynamoDB 交易學習如何安全地建模這些情境,並用 Expression Builder 建構它們需要的條件運算式。想對你自己的資料表試試看 — 請下載 DynoTable

參考資料

最後驗證於 2026-07-13,對照上方連結的 AWS 官方文件;100 個動作與 4 MB 的限制已於 2026-07-28 從 API 參考文件重新取得。

上方那些回絕已於 2026-07-28 透過 @aws-sdk/client-dynamodb 3.1095.0,對照 DynamoDB Local 3.3.0(amazon/dynamodb-local:latest)重現。每一段引用的字串都是引擎輸出的逐字原文。

不必透過主控台就能操作 DynamoDB

一款快速的 DynamoDB 桌面用戶端,可執行 DynamoDB 無法執行的真正 SQL — JOINs、GROUP BY、聚合 — 並支援視覺化編輯與使用你自己的 Bedrock 金鑰的 AI 代理。

30 天免費試用,無需信用卡 — 之後為無時間限制的免費方案。