DynamoDB 是最终一致性的吗?
默认是。DynamoDB 的读取是最终一致性的:紧跟着一次写入的读取可能反映不出那次写入,但过一小会儿再读一次就会返回最新的项目。你可以在表和 LSI 上选择强一致性读取;全局二级索引则始终是最终一致性的。
最终一致性(默认)
一次最终一致性读取可能反映不出刚刚完成的写入。过一会儿再读一次,它就会返回当前值。这是默认模式,而且计费只有强一致性读取的一半。
强一致性读取
设置 ConsistentRead: true 就能拿到最近提交的数据(一次强一致性读取)。基表和本地二级索引(LSI)支持这一点——但全局二级索引(GSI)和 DynamoDB Streams 不支持,它们始终是最终一致性的。
GSI 这个例外是在 API 层面强制执行的,而不是留给你自觉遵守:对一个全局二级索引带 ConsistentRead: true 的 Query 会让整个请求失败,而不是悄悄降级(确切的拒绝信息)。
这个选择要花多少钱
"价格减半"是文档上的规则;下面是它折算出来的数。假设在 us-east-1 每秒读取 1,000 次 4 KB 的项目,别的什么都没有:
| 一致性 | 每次读取的读取单元 | 按需 / 每月 | 预置 / 每月 |
|---|---|---|---|
| 最终一致性 | 0.5 | $164.25 | $47.45(500 RCU) |
| 强一致性 | 1 | $328.50 | $94.90(1,000 RCU) |
输入参数放在这里,你可以自己核对:一个 730 小时的月份有 2,628,000 秒,每百万读取请求单元 $0.125,每 RCU-小时 $0.00013。一个 4 KB 的项目是一个读取单元,最终一致性下减半。
所以在这个工作负载上,每月 $164 就是"永不读到过期项目"的固定价码。对一个账户余额来说这很便宜,对一个商品列表来说则是浪费——这正是这个标志位是按请求而不是按表设置的原因。用定价计算器给你自己的数字标个价。
为什么是这样运作的
DynamoDB 会自动把你的数据复制到三个可用区。最终一致性让读取不必等待每一份副本就能被服务——更快也更便宜;强一致性则返回最新的数据。
那多区域(全局表)呢?
跨区域复制有它自己的一致性设置。全局表默认使用多区域最终一致性(MREC),变更通常在一秒或更短时间内复制到其他区域。你也可以改为创建一个多区域强一致性(MRSC)的全局表:写入会同步复制到至少一个其他区域,而在任何副本上的强一致性读取总是返回项目的最新版本。
深入了解
阅读 DynamoDB 一致性了解完整的取舍。下载 DynoTable 可以在查询上切换读取一致性。
参考资料
- DynamoDB read consistency — Amazon DynamoDB Developer Guide
- How DynamoDB global tables work — Amazon DynamoDB Developer Guide
- Query — Amazon DynamoDB API Reference
- What is Amazon DynamoDB? — Amazon DynamoDB Developer Guide
最后核实于 2026-07-13,依据上方链接的 AWS 官方文档;单价已于 2026-07-28 重新核对。
GSI 的拒绝行为于 2026-07-28 通过 @aws-sdk/client-dynamodb 3.1095.0 针对 DynamoDB Local 3.3.0(amazon/dynamodb-local:latest)复现,而成本表由计算器所用的同一份定价数据算出。