DynamoDB は ACID に準拠していますか?
はい。DynamoDB は TransactWriteItems と TransactGetItems の API を通して ACID トランザクションに対応しています。これらは最大 100 アクションを 1 つのオール・オア・ナッシングの操作にまとめ、1 つの AWS リージョン内で原子性・一貫性・分離性・耐久性を保証します。単一アイテムの書き込みもアトミックかつ耐久的ですが、複数アイテムの ACID にはトランザクション API が必要です。
ここでの ACID の意味
DynamoDB のトランザクションは、すべてのアクションを適用するか 1 つも適用しないかのどちらかであり(原子性)、データを妥当な状態に保ち(一貫性)、同時実行される他のトランザクションから分離され、成功を返した時点で耐久的にコミットされています。これらの保証は、トランザクション API を呼び出した AWS リージョン内で成り立ちます。
トランザクション API
TransactWriteItems—Put、Update、Delete、ConditionCheckのアクションをまとめる、同期的でべき等な書き込み。TransactGetItems— 複数アイテムのアトミックで一貫した読み取り。
1 つのトランザクションで同じアイテムを 2 回対象にすることはできません。
上限は 25 ではなく 100
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 はもう少し率直です。101 キーの BatchGetItem は Too many items requested for the BatchGetItem call を返し、26 件の BatchWriteItem は自分の名前を入れた同じ文を返します。
1 つのアイテムを 2 回対象にした場合も、各アクションが単独なら成功するものであっても失敗します。
ValidationException: Transaction request cannot include multiple operations on one itemこれは、受信イベントのループからアクションのリストを組み立てる際に、キーで重複を除かないコードが引っかかるものです。
トランザクションは課金も 2 倍です。1 KB のアイテム 100 件をトランザクションで書き込むと 200 書き込みユニットを消費します。同じアイテムを個別に書けば 100 です。つまり、何も失敗しなくてもアトミック性には値段があります。
グローバルテーブルではどうなりますか
トランザクションが ACID なのは、それを呼び出したリージョンの中だけです。既定のマルチリージョン結果整合(MREC)モードのグローバルテーブルでは、トランザクション書き込みは 1 つの単位としてはレプリケートされません。変更が伝播する間、別のリージョンが部分的にレプリケートされたトランザクションを一時的に観測しうるということです。マルチリージョン強整合(MRSC)向けに構成されたグローバルテーブルは、トランザクション API にそもそも対応していません。
さらに詳しく
これらを安全にモデル化する方法は 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 アクションと 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)に対して再現しました。引用した文字列はすべてエンジンの出力そのままです。