Transactions 是否可以将表属性作为DynamoDB事务特性中的多个操作之一进行原子递增?

Transactions 是否可以将表属性作为DynamoDB事务特性中的多个操作之一进行原子递增?,transactions,amazon-dynamodb,Transactions,Amazon Dynamodb,我们的团队有一个DDB表,其中包含具有表示各种生命周期状态的“state”属性的项。我们还有另一个表,它按状态跟踪这些项的计数(分区键是集合项分组所依据的容器类型的id,排序键是状态)。目前,我们使用lambda来保持由包含项的表上的ddb流触发的计数同步,但是我们在这方面遇到了一些问题(延迟、幂等性),并且正在研究使用DynamoDB事务作为一种在更改项的状态时同步更新计数表的方法 我想知道是否有一种方法可以使用AttributeValueUpdate+“AttributeAction.add

我们的团队有一个DDB表,其中包含具有表示各种生命周期状态的“state”属性的项。我们还有另一个表,它按状态跟踪这些项的计数(分区键是集合项分组所依据的容器类型的id,排序键是状态)。目前,我们使用lambda来保持由包含项的表上的ddb流触发的计数同步,但是我们在这方面遇到了一些问题(延迟、幂等性),并且正在研究使用DynamoDB事务作为一种在更改项的状态时同步更新计数表的方法

我想知道是否有一种方法可以使用AttributeValueUpdate+“AttributeAction.add”进行原子式增量添加,就像但在DynamoDB事务中一样,这样对项目状态和计数增量的更新将是一个ACID、全部或无操作?示例中的方法使用带有AttributeValueUpdate的UpdateItemRequest,而事务似乎只能使用,我还没有找到一种方法将AttributeValueUpdate用于该对象。 这里


从我对事务的理解来看,没有对独立操作的排序,因此任何操作都不能依赖于另一个操作的输出(我无法读取值,然后在同一事务中添加到该值),如果我先读取值,则在事务发生时可能会发生更改。我还没有在DynamoDB事务中找到任何其他递增值的示例,希望有人能告诉我这是否可行。

这绝对是可能的,您只是无法访问
UpdateItemRequest
用来构造更新表达式的流畅API(通过
AttributeValueUpdate
)。相反,您必须手工编写更新表达式

在链接的示例中,显示以下内容:

UpdateItemRequest updateRequest =
    new UpdateItemRequest().withTableName("local-content")
        .withKey(key)
        .addAttributeUpdatesEntry("views", new AttributeValueUpdate()
            .withValue(new AttributeValue().withN("" + delta))
            .withAction(AttributeAction.ADD));
相当于这样的东西:

// Create a map of expression attribute values with the amount to increment by
Map<String, AttributeValue> values = new HashMap<String, AttributeValue>();
values.put(":one", new AttributeValue().withN("1"));

Update update =
    new Update().withTableName("local-content")
        .withKey(key)
        .withExpressionAttributeValues(values)
        .withUpdateExpression("ADD views :one");
//创建表达式属性值的映射,其增量为
映射值=新的HashMap();
value.put(“:一”,新的AttributeValue(),带n(“1”);
更新=
新的更新().withTableName(“本地内容”)
.带钥匙(钥匙)
.带有表达式属性值(值)
.withUpdateExpression(“添加视图:一个”);

话虽如此,请记住,DynamoDB事务比非事务性操作的成本要高得多,而且您正在尝试的操作可能会在高吞吐量时崩溃,因为计数器将成为热键。

谢谢!我很确定我们在高吞吐量/热键问题上应该没有问题-所讨论的服务最初是专门针对这一问题进行调整的。并非所有项目的状态计数都是全局的,项目按容器类型分组,状态计数设置在该级别。此外,当选择项目的目的是改变其状态时,服务使用技术来防止生成热键。不过,我确实理解成本的增加,如果我们选择采用这种解决方案,我们会注意到这一点。不过还是要感谢你的提醒!