DynamoDB 支援交易嗎?
支援。DynamoDB 透過 TransactWriteItems 與 TransactGetItems 支援 ACID 交易。每一筆交易會把同一帳戶、同一區域內一張或多張資料表上的最多 100 個動作,組成單一次全有全無的操作,合計大小上限為 4 MB。只要有任何一個動作失敗,就一個都不會套用。
兩套交易 API
TransactWriteItems— 以不可分割的方式批次處理Put、Update、Delete與ConditionCheck動作。同步且具冪等性。TransactGetItems— 在單一次不可分割、一致的快照中讀取多個項目。
規則與限制
- 每筆交易最多 100 個項目,可跨一張或多張資料表。
- 所有資料表必須位於同一帳戶與同一區域。
- 合計的項目大小不得超過 4 MB。
- 你不能在一筆交易中對同一個項目下手兩次。
- 在全域資料表上,ACID 保證只適用於交易執行的那個區域 — 變更會在提交後才複寫到其他區域,而處於多區域強一致性(MRSC)模式的全域資料表根本不支援交易 API。
不可分割性的代價
同一個項目,兩條路徑,並開啟 ReturnConsumedCapacity:
PutItem, one 920-byte item ConsumedCapacity 1
TransactWriteItems, the same single Put ConsumedCapacity 2一次交易式寫入等於兩次寫入的容量,一次交易式讀取等於兩次讀取的容量。持續下去,那個翻倍就是全部的取捨:每秒 100 次 1 KB 項目的寫入,在 us-east-1 隨需模式下是每月 $164.25,如果每一次都走交易則是 $328.50。定價計算機裡有一個交易式一致性設定,正是為了這個比較而做的。
那個不會套用兩次的重試
一筆逾時的交易可能其實已經提交了,所以危險的部分是重試,不是交易本身。ClientRequestToken 就是讓重試變安全的東西。用同一個 token 把同一筆 ADD counter :one 交易送兩次:
TransactWriteItems (token order-4711) 200
TransactWriteItems (token order-4711) 200
GetItem counter {"N": "1"}兩次呼叫都成功了,而計數器只動了一次。這個 token 在第一次請求結束後 10 分鐘內都有效;晚一點再重用它,第二次呼叫就是一筆新交易,計數器會再動一次。在有效期內重用它、卻改了任何其他參數,DynamoDB 會回 IdempotentParameterMismatch。
交易與批次的差別
BatchWriteItem 是每個項目各自套用(有些寫入可能成功、有些失敗),而交易則是全有全無 — 當部分套用會弄壞你的資料時,就該用它。
深入了解
在 DynamoDB 交易裡學各種模式,並用 Expression Builder 建構它們所仰賴的條件運算式。下載 DynoTable,把你的項目編輯暫存成可審閱的差異,再一起以交易式批次提交。
參考資料
- Amazon DynamoDB Transactions: How it works — Amazon DynamoDB Developer Guide
- TransactWriteItems — Amazon DynamoDB API Reference
- How DynamoDB global tables work — Amazon DynamoDB Developer Guide
最後驗證於 2026-07-13,對照上方連結的 AWS 官方文件;100 個動作的限制與 10 分鐘的冪等性有效期已於 2026-07-28 重新查核。
那些 ConsumedCapacity 值與冪等重播已於 2026-07-28 透過 @aws-sdk/client-dynamodb 3.1095.0,對照 DynamoDB Local 3.3.0 重現;每月成本則以我們同步的 AWS 定價表中 us-east-1 隨需寫入請求單位價格計算。