DynamoDB は ACID に準拠していますか?

はい。DynamoDB は TransactWriteItemsTransactGetItems の API を通して ACID トランザクションに対応しています。これらは最大 100 アクションを 1 つのオール・オア・ナッシングの操作にまとめ、1 つの AWS リージョン内で原子性・一貫性・分離性・耐久性を保証します。単一アイテムの書き込みもアトミックかつ耐久的ですが、複数アイテムの ACID にはトランザクション API が必要です。

ここでの ACID の意味

DynamoDB のトランザクションは、すべてのアクションを適用するか 1 つも適用しないかのどちらかであり(原子性)、データを妥当な状態に保ち(一貫性)、同時実行される他のトランザクションから分離され、成功を返した時点で耐久的にコミットされています。これらの保証は、トランザクション API を呼び出した AWS リージョン内で成り立ちます。

トランザクション API

  • TransactWriteItemsPutUpdateDeleteConditionCheck のアクションをまとめる、同期的でべき等な書き込み。
  • 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 キーの BatchGetItemToo 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 をダウンロードしてください。

参考資料

最終検証日 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)に対して再現しました。引用した文字列はすべてエンジンの出力そのままです。

Console なしで DynamoDB を扱う

DynamoDB では実行できない本物の SQL(JOINs、GROUP BY、集計)を実行する高速な DynamoDB デスクトップクライアント。ビジュアル編集と、あなた自身の Bedrock キーで動く AI エージェントを備えています。

30日間無料トライアル、クレジットカード不要 — その後は期限のない Free プラン。