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 事务里学习相关模式,并用表达式构建器构建它们所依赖的条件表达式。下载 DynoTable,把你的条目编辑暂存成可审阅的 diff,再作为一个事务批次一起提交。
参考资料
- 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,针对 DynamoDB Local 3.3.0,经由 @aws-sdk/client-dynamodb 3.1095.0;月度成本依据我们同步的 AWS 定价表中 us-east-1 按需写请求单元价格计算。