为什么我的 TransactWriteItems API 调用在 Amazon DynamoDB 中会失败?

上次更新日期:2022 年 9 月 7 日

我的 TransactWriteItems API 调用失败,我想要知道此问题的根源。

解决方法

TransactWriteItems 请求失败或被 Amazon DynamoDB 拒绝的原因有很多。

未满足其中一个条件表达式中的条件

如果未满足您为 TransactWriteItems 请求中的其中一个操作设定的条件,则所有操作都会失败。TransactWriteItems 是一个同步写入操作,最多可分组 25 个操作请求。因此,要么所有操作请求都成功,要么所有操作请求都失败。

如果您遇到此问题,则您会收到以下类似错误消息:

"message": "Transaction cancelled, please refer cancellation reasons for specific reasons [ConditionalCheckFailed, None, None, None] (Service: AmazonDynamoDBv2; Status Code: 400; Error Code: TransactionCanceledException;..."

要解决此问题,请确保满足您为请求设定的所有条件。

TransactWriteItems 请求中的表位于不同区域或账户中

TransactWriteItems 请求使您能够处理不同表中的项目。但是,您无法处理位于不同区域或账户中的表。请确保您处理的表与您从中发出 TransactWriteItems 请求的账户位于相同区域。

TransactWriteItems 操作中的多个操作处理相同项目

当 TransactWriteItems 操作中的多个操作处理相同项目时,该请求将会失败并显示以下类似消息:

“Transaction request cannot include multiple operations on one item”(事务请求无法在一个项目中包括多个操作)

例如,如果 TransactWriteItems 尝试对相同项目运行 ConditionCheckPut 操作,则请求将会失败。您可以通过使用 Amazon CloudWatch 中的 DynamoDB 表的 TransactionConflict 指标来监控 TransactionConflict 异常。

没有足够的预置容量来完成事务

与其他任何操作一样,当您调用 TransactWriteItems 操作时,DynamoDB 表可能会受限。有关解决此问题的更多信息,请参阅为什么我的按需 Amazon DynamoDB 表受限?为什么我的 Amazon DynamoDB 表受限?

出现了 ValidationError

如果项目大小大于 400 KB 或本地二级索引(LSI)过大时,则会出现 ValidationErrror。同样,事务所做的更改也可能导致出现验证错误。这意味着输入无法满足 DynamoDB 服务指定的一个或多个约束。验证错误伴随会显示以下其中一个消息,具体取决于未满足哪个约束

  • 一个或多个参数值无效。
  • 更新表达式尝试更新的二级索引键超出允许的大小限制。
  • 更新表达式尝试更新的二级索引键为不受支持的类型。
  • 更新表达式中的操作数的数据类型不正确。
  • 要更新的项目已超出允许的最大大小。
  • 您尝试存储的量级数字大于受支持的范围,也就是数字溢出。
  • 要更新的属性中存在类型不匹配的情况。
  • 嵌套级别超出受支持的限制。
  • 更新表达式中提供的文档路径对于更新来说无效。
  • 提供的表达式引用了项目中不存在的属性。

DynamoDB 限制了您可以在表中存储的每个项目的大小。如果您的应用程序需要存储在项目中的数据大小超出所允许的限制,请压缩一个或多个较大的属性。或者,将项目分解为多个按排序键索引的项目。您也可以将项目存储为 Amazon Simple Storage Service (Amazon S3) 中的对象。然后,将 Amazon S3 对象标识符存储在您的 DynamoDB 项目中。有关更多信息,请参阅存储大型项目和属性的最佳实践

事务中的项目大聚合大小超过 4 MB

TransactWriteItems 操作不能超过 4 MB。这是一个硬性限制。有关更多信息,请参阅 DynamoDB 事务

出现了用户错误

多种原因可能会导致出现用户错误(如无效的数据格式)。例如,您可能会因为 TransactWriteItems operation 操作无法找到基本 DynamoDB 表或索引而收到 ResourceNotFoundException 4xx 错误。或者,DynamoDB 表或索引可能未处于活动状态。

注意:当您使用适用于Java 的 AWS SDK 时,DynamoDB 将会在 CancellationReasons 属性上列出取消原因。未使用其他语言设置此属性。事务取消原因将按请求项目的顺序列出。如果项目没有错误,则会列出 NONE 代码和 null 消息。有关更多信息,请参阅 TransactWriteItems


这篇文章对您有帮助吗?


您是否需要账单或技术支持?