使用DynamoDBMapper事务更新时出现键条件数量无效错误
问题排查与解决
你的代码抛出该异常的核心原因是:DynamoDB事务中的更新操作必须指定条件表达式,用来约束键的存在性或其他业务条件,否则会触发键条件数量无效的错误。
你需要给UpdateItemRequest添加条件表达式,确保要更新的条目确实存在(这是事务更新最常见的约束场景),修改后的代码如下:
TransactionWriteRequest transactionWriteRequest = new TransactionWriteRequest(); HashMap<String, AttributeValue> attributeValues = new HashMap<>(); attributeValues.put(":amount", new AttributeValue().withN(amount)); // key Map<String, AttributeValue> key = new HashMap<>(); key.put("pk", new AttributeValue().withS(pk)); key.put("sk", new AttributeValue().withS(sk)); UpdateItemRequest updateItemRequest = new UpdateItemRequest() .withKey(key) .withTableName("dynamo-test") .withUpdateExpression("SET amt = amt + :amount") .withExpressionAttributeValues(attributeValues) // 添加条件表达式,确保主键对应的条目存在 .withConditionExpression("attribute_exists(pk) AND attribute_exists(sk)"); transactionWriteRequest.addUpdate(updateItemRequest); dynamoDBMapper.transactionWrite(transactionWriteRequest);
补充说明
- 条件表达式
attribute_exists(pk) AND attribute_exists(sk)用来验证要更新的条目确实存在于表中,既避免误操作不存在的条目,也满足DynamoDB事务对更新操作的强制条件要求。 - 如果你有其他业务逻辑需求,可以替换为符合场景的条件表达式(比如判断
amt的当前值范围等),但必须保证表达式包含有效的约束逻辑。
内容的提问来源于stack exchange,提问作者Shailendra
相关产品推荐
相关产品推荐

