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 事务里学习如何安全地为这些建模,并用表达式构建器构建它们所需的条件表达式。针对你自己的表试一试——下载 DynoTable

参考资料

最后核实于 2026-07-13,依据上方链接的 AWS 官方文档;100 个动作与 4 MB 的限制已于 2026-07-28 从 API 参考文档重新取回。

上方的拒绝复现于 2026-07-28,针对 DynamoDB Local 3.3.0(amazon/dynamodb-local:latest),经由 @aws-sdk/client-dynamodb 3.1095.0。每一条引用的字符串都是原样的引擎输出。

无需控制台即可使用 DynamoDB

一款快速的 DynamoDB 桌面客户端,可运行 DynamoDB 无法执行的真正 SQL——JOINs、GROUP BY、聚合——并支持可视化编辑和运行在你自己的 Bedrock 密钥上的 AI agent。

30 天免费试用,无需信用卡 — 之后为无时间限制的免费版。