使用 AWS CLI 的 DynamoDB TransactWriteItems

aws dynamodb transact-write-items 把多达 100 次写入组成一次全有或全无的操作——要么每个动作都提交,要么一个都不提交。这些动作以混合了 PutUpdateDeleteConditionCheck 的 JSON 数组放入 --transact-items,每个都可带一个可选条件。

Code

aws dynamodb transact-write-items \
  --transact-items '[
    {
      "Update": {
        "TableName": "Music",
        "Key": {"Artist": {"S": "Arturo Sandoval"}, "SongTitle": {"S": "Cubano Chant"}},
        "UpdateExpression": "SET #upd0 = #upd0 - :one",
        "ConditionExpression": "#upd0 >= :one",
        "ExpressionAttributeNames": {"#upd0": "Awards"},
        "ExpressionAttributeValues": {":one": {"N": "1"}}
      }
    },
    {
      "Update": {
        "TableName": "Music",
        "Key": {"Artist": {"S": "Arturo Sandoval"}, "SongTitle": {"S": "A Mis Abuelos"}},
        "UpdateExpression": "SET #upd0 = if_not_exists(#upd0, :zero) + :one",
        "ExpressionAttributeNames": {"#upd0": "Awards"},
        "ExpressionAttributeValues": {":one": {"N": "1"}, ":zero": {"N": "0"}}
      }
    }
  ]'

成功时该命令不打印任何内容,并以 0 退出。如果任何条件失败,整个事务都会取消:

An error occurred (TransactionCanceledException) when calling the TransactWriteItems
operation: Transaction cancelled, please refer cancellation reasons for specific
reasons [ConditionalCheckFailed, None]

说明

  • --transact-items — 多达 100 个 Put / Update / Delete / ConditionCheck 动作,合计 4 MB,值采用 DynamoDB JSON。动作可以跨表(同一账户 + 区域),但任意两个动作都不可针对同一个项目——仅此一条就会取消事务。
  • 取消原因随错误消息按动作顺序给出——代码包括 ConditionalCheckFailedTransactionConflict(另一个事务在中途触及了某个项目——可安全重跑)、ProvisionedThroughputExceededValidationErrorNone 标记无辜的动作。这里第一个更新的条件(Awards >= 1)失败了;第二个动作本身没问题。
  • ConditionCheck — 对事务修改的某个项目断言一个条件,若失败则否决整个事务。
  • --client-request-token — 传入一个固定令牌,可让重跑在 10 分钟内保持幂等;超时后重跑同一条命令便不会把写入应用两次。
  • 成本 — 事务写入的计费大约是普通写入 WCU 的 2 倍(准备 + 提交)。若只需对单个项目保证原子性,一次条件写入是更便宜的工具。
  • 提示:把动作数组放进文件并用 --transact-items file://transaction.json 传入。

可视化操作

每个动作内部的条件和更新表达式才是繁琐之处——DynamoDB Expression Builder 会连同名称/值映射一起组装它们,并复制可直接运行的命令。

想在 GUI 中编辑项目并审阅生成的表达式——请下载 DynoTable

相关示例

References

Last verified 2026-07-13 against the official AWS documentation linked above.

无需控制台即可使用 DynamoDB

DynoTable 是面向 DynamoDB 的快速桌面客户端 —— 浏览表、运行 SQL 风格的查询,并在本地编辑项。