我尝试用DynamoDB实现一种方法,允许只插入项目而不更新/替换项目(以实现某种级别的事务控制)。因此,我在AWS DynamoDB中配置了以下DB Schema:
PartitionKey="driveUniqueId (String)"
SortKey="createTime (String)"
现在,如果我运行下面的代码片段,操作就会工作,记录就会创建。
String currentTime = LocalTime.now().toString();
dynamoDbClient.transactWriteItems(TransactWriteItemsRequest.builder()
.transactItems(
TransactWriteItem.builder().put(
Put.builder()
.tableName(tableName)
.item(Map.of(
"driveUniqueId", AttributeValue.builder().s("789").build(),
"createTime", AttributeValue.builder().s(currentTime).build()))
.build())
.build())
.build());
然而,如果我运行下面的代码片段,添加conditionCheck
以防止替换,那么我会得到下面的错误:
dynamoDbClient.transactWriteItems(TransactWriteItemsRequest.builder()
.transactItems(
TransactWriteItem.builder().put(
Put.builder()
.tableName(tableName)
.item(Map.of(
"driveUniqueId", AttributeValue.builder().s("123").build(),
"createTime", AttributeValue.builder().s(currentTime).build()))
.build())
.build(),
TransactWriteItem.builder().conditionCheck(
ConditionCheck.builder()
.tableName(tableName)
.key(Map.of(
"driveUniqueId", AttributeValue.builder().s("123").build()))
.conditionExpression("attribute_not_exists(driveUniqueId)")
.build())
.build())
.build());
/*
Error:
CancellationReason(Code=None)
CancellationReason(Code=ValidationError, Message=The provided key element does not match the schema)
*/
我不明白为什么在第二次写操作中指定的条件不能将“driveUniqueId”理解为schema的一部分。我使用Quarkus、Java 17和AWS SDK 2.17.291运行此代码。
2条答案
按热度按时间zaq34kh61#
您的条件检查导致验证错误,因为您没有包括项sork key
createTime
。与对DynamoDB的任何写入一样,您必须包括完整的主键、分区和排序键。
此外,您可能不需要使用事务,单项操作是ACID兼容的,因此您可以简单地使用带有条件检查的
PutItem
。njthzxwz2#
这是我基于@Lee Hanningan回应的最终解决方案。