Transaction request cannot include multiple operations on one item
TL;DR — 同一个 TransactWriteItems 请求中的两个操作指向了同一个项目(相同的主键)。DynamoDB 要求一个事务中的每个项目都唯一,因此它在运行任何操作之前就拒绝了整个调用。把重复的操作合并成一个,或者把其中一个移到一次单独的写入。
含义
ValidationException: Transaction request cannot include multiple operations on one item一个 TransactWriteItems 请求把最多 100 个操作(Put、Update、Delete、ConditionCheck)分组,它们要么全部提交要么全部失败。那个 API 的一条硬性规则是没有两个操作能指向同一个项目——DynamoDB 用完整的主键来标识一个项目,每个键至多出现一次。这是一个 HTTP 400 ValidationException,在事务执行前被捕获,且原样不可重试。
为什么会发生
- 对同一个键既
ConditionCheck又写入——你试图在同一个事务中对一个项目断言一个条件,同时又Update/Delete它。改为把条件折进写入的ConditionExpression。 - 对同一个键的两次写入——例如对同一个项目的一次
Put和一次Update,常常来自一个不按键去重的循环。 - 一个带重复键的生成批次——一个 ORM 或映射层两次发出了同一个分区键+排序键。
- 在你_以为_不同的表之间,同一个键出现在两个不同的操作中——项目由
{table, PK, SK}唯一确定;同一张表内的重复会触发它。
如何修复
- 在构建事务之前按主键去重——每个
{PK, SK}只能出现一次。 - 把一个
ConditionCheck合并进它守护的写入:把断言放进那个项目自己的ConditionExpression,而不是添加一个单独的ConditionCheck操作。 - 用一个单一的
UpdateExpression(SET/ADD/REMOVE)把两个改动合并成一个Update,而不是两个操作。 - 把不可避免的多步逻辑拆分到不同的事务或写入中,如果这些操作确实无法表达为一个操作。
手工组合多项目事务正是重复键溜进来之处。DynoTable 桌面应用按主键显示每个项目,因此一个重复的目标在你发送请求之前就一目了然。
先在 DynoTable 中检查
在构建多项目事务之前,在 DynoTable 中列出目标键 — 使用 ⌘K 打开表,并确认每个主键在操作列表中是唯一的。暂存 (⌘S) 可让你在扩大规模之前测试单项交易。使用 Expression Builder 将条件检查合并到写入中。使用 ⌘P 切换配置文件;参见连接 AWS和安装。
来源
- TransactWriteItems — Amazon DynamoDB API Reference(2026-07-13 验证)
- Amazon DynamoDB Transactions: How it works(2026-07-13 验证)
相关错误
- TransactionCanceledException——事务解析了,但一个条件或冲突在提交时取消了它。
- Too many items in a TransactWriteItems call——一个事务中超过 100 个操作。
- ValidationException (overview)
- 代码示例:TransactWriteItems in Node.js——一个可改用的有效多项目事务。
- 学习:DynamoDB transactions
参考资料
- TransactWriteItems — Amazon DynamoDB API Reference
- Amazon DynamoDB Transactions: How it works — Amazon DynamoDB Developer Guide
- Error handling with DynamoDB — Amazon DynamoDB Developer Guide
最后核实于 2026-07-13,依据上方链接的 AWS 官方文档。