我在 Amazon DynamoDB 中的 TransactWriteItems API 调用失败。我想知道问题的根本原因。
解决方法
由于各种原因,TransactWriteItems API 请求可能会失败或被 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 请求允许您处理不同表中的项目。但是您只能使用与发送的请求位于同一 AWS 区域和账户中的表。要解决此问题,请仅使用与发出 TransactWriteItems 请求的相同 AWS 账户中位于同一 AWS 区域的表。
在 TransactWriteItems 操作中,同一项目由多项操作处理
如果 TransactWriteItems 操作中的多项操作处理同一个项目,则请求会失败,您将收到类似于以下内容的错误消息:
“Transaction request cannot include multiple operations on one item”(事务请求不能包含对一个项目的多项操作)
例如,如果 TransactWriteItems 尝试对同一个项目同时运行 ConditionCheck 操作和 Put 操作,则请求将失败,并出现 TransactionConflictException。您可以在 Amazon CloudWatch 中使用 DynamoDB 表的 TransactionConflict 指标来监控此异常。
并发 TransactWriteItems 请求之间的冲突
由于多个事务中对同一项目的并发项目级请求,会导致发生事务冲突。事务冲突可能由于以下原因而发生:
- 针对某个项目的 PutItem、UpdateItem 或 DeleteItem 请求与正在进行的包含同一项目的 TransactWriteItems 请求相冲突。
- TransactWriteItems 请求中的项目是其他正在进行的 TransactWriteItems 请求的一部分。
如果 PutItem、UpdateItem 或 DeleteItem 请求因此被拒绝,则该请求将失败,并出现 TransactionConflictException。但是,如果 TransactWriteItems 或 TransactGetItems 中的项目级请求因其他原因被拒绝,则该请求会失败,并出现 TransactionCanceledException。
没有足够的预置容量来完成事务
如果您在预置容量不足时调用 TransactWriteItems 请求,则 DynamoDB 表会被限流。有关限流的详细信息,请参阅为什么我的按需 DynamoDB 表被限流?以及为什么我的 Amazon DynamoDB 预置表被限流?
由于 IdempotentParameterMismatch 异常而导致事务失败
您可以在 TransactWriteItems 请求中加入可选的客户端令牌,以确保请求是幂等的。当由于连接超时或其他连接问题而多次提交同一操作时,幂等事务有助于防止应用程序出错。
客户端令牌在使用该令牌的请求完成后 10 分钟内有效。如果使用该令牌的请求在 10 分钟窗口内重复发送,但在事务中更改了某些参数,则 DynamoDB 将返回 IdempotentParameterMismatch 异常。
出现 ValidationError
如果项目的大小超过 400 KB 或本地二级索引 (LSI) 变得过大,则会出现 ValidationError。DynamoDB 限制了您可以存储在表中的每个项目的大小。如果您的应用程序在项目中存储的数据必须超过大小限制允许的数据,请压缩一个或多个较大的属性。或者,将大项目分解为多个较小的项目,按排序键索引。您还可以将项目作为对象存储在 Amazon Simple Storage Service (Amazon S3) 存储桶中。完成此操作后,您可以将 Amazon S3 对象标识符存储在您的 DynamoDB 项目中。有关详细信息,请参阅存储大型项目和属性的最佳实践。
由于事务所做的更改,也可能会发生验证错误。这意味着请求中的参数不满足 DynamoDB 服务指定的一个或多个约束条件。有关约束条件类型及其相关错误消息的详细信息,请参阅类 TransactionCanceledException 的文档。
事务中项目的总大小超过 4 MB
TransactWriteItems 操作不能超过 4 MB。这是一个硬性限制。有关详细信息,请参阅 DynamoDB 事务。
出现 4xx 错误
用户错误,例如无效的数据格式,可能因多种原因而发生。例如,由于 TransactWriteItems 操作找不到底层 DynamoDB 表或索引,您可能会收到 4xx 错误或 ResourceNotFoundException 错误。或者,DynamoDB 表或索引可能并不处于 ACTIVE 状态。
注意: 当您使用适用于 Java 的 AWS SDK 时,DynamoDB 会在 CancellationReasons 属性中列出取消原因。而其他语言的 SDK 不会设置此属性。事务取消原因按请求的项目顺序列出。
出现 5xx 错误
事务也可能由于系统错误而失败,这些错误被记录为 5xx 错误。当服务无法满足请求时,您会遇到这些错误。发生这些错误的原因可能多种多样,例如实例集中的临时网络问题、基础设施问题、与存储节点相关的问题等。有关详细信息,请参阅对 Amazon DynamoDB 中的内部服务器错误进行故障排除。
相关信息
常见错误
TransactWriteItems API