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 个操作(PutUpdateDeleteConditionCheck)分组,它们要么全部提交要么全部失败。那个 API 的一条硬性规则是没有两个操作能指向同一个项目——DynamoDB 用完整的主键来标识一个项目,每个键至多出现一次。这是一个 HTTP 400 ValidationException,在事务执行前被捕获,且原样不可重试

为什么会发生

  • 对同一个键既 ConditionCheck 又写入——你试图在同一个事务中对一个项目断言一个条件,同时又 Update/Delete 它。改为把条件折进写入的 ConditionExpression
  • 对同一个键的两次写入——例如对同一个项目的一次 Put 和一次 Update,常常来自一个不按键去重的循环。
  • 一个带重复键的生成批次——一个 ORM 或映射层两次发出了同一个分区键+排序键。
  • 在你_以为_不同的表之间,同一个键出现在两个不同的操作中——项目由 {table, PK, SK} 唯一确定;同一张表内的重复会触发它。

如何修复

  1. 在构建事务之前按主键去重——每个 {PK, SK} 只能出现一次。
  2. 把一个 ConditionCheck 合并进它守护的写入:把断言放进那个项目自己的 ConditionExpression,而不是添加一个单独的 ConditionCheck 操作。
  3. 用一个单一的 UpdateExpressionSET/ADD/REMOVE)把两个改动合并成一个 Update,而不是两个操作。
  4. 把不可避免的多步逻辑拆分到不同的事务或写入中,如果这些操作确实无法表达为一个操作。

手工组合多项目事务正是重复键溜进来之处。DynoTable 桌面应用按主键显示每个项目,因此一个重复的目标在你发送请求之前就一目了然。

先在 DynoTable 中检查

在构建多项目事务之前,在 DynoTable 中列出目标键 — 使用 ⌘K 打开表,并确认每个主键在操作列表中是唯一的。暂存 (⌘S) 可让你在扩大规模之前测试单项交易。使用 Expression Builder 将条件检查合并到写入中。使用 ⌘P 切换配置文件;参见连接 AWS安装

来源

相关错误

参考资料

最后核实于 2026-07-13,依据上方链接的 AWS 官方文档。

无需控制台即可使用 DynamoDB

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

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