适用于 Java 的 SDK 版本 1 和版本 2 之间的乐观锁定区别 - AWS SDK for Java 2.x

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

适用于 Java 的 SDK 版本 1 和版本 2 之间的乐观锁定区别

V1 和 V2 都使用属性注释实现乐观锁定,该注释标记 bean 类上的一个属性来存储版本号。

乐观锁定行为的差异
V1 第 2 版
Bean 类注释 @DynamoDBVersionAttribute @DynamoDbVersionAttribute(请注意,V2 使用小写的 “b”)
初始保存 版本号属性设置为 1。

使用设置的版本属性的起始值@DynamoDbVersionAttribute(startAt = X)。默认值为 0。

更新 如果条件检查验证正在更新的对象的版本号是否与数据库中的版本号相匹配,则版本号属性将增加 1。

如果条件检查验证正在更新的对象的版本号是否与数据库中的版本号相匹配,则版本号属性将递增。

版本号属性按设置的incrementBy选项递增。@DynamoDbVersionAttribute(incrementBy = X)默认值为 1。

删除 DynamoDBMapper添加条件检查,以确定要删除的对象的版本号是否与数据库中的版本号相匹配。

V2 不会自动为删除操作添加条件。如果要控制删除行为,则必须手动添加条件表达式。

以下示例recordVersion是 Bean 的版本属性。

// 1. Read the item and get its current version. Customer item = customerTable.getItem(Key.builder().partitionValue("someId").build()); AttributeValue currentVersion = item.getRecordVersion(); // 2. Create conditional delete with the `currentVersion` value. DeleteItemEnhancedRequest deleteItemRequest = DeleteItemEnhancedRequest.builder() .key(KEY) .conditionExpression(Expression.builder() .expression("recordVersion = :current_version_value") .putExpressionValue(":current_version_value", currentVersion) .build()).build(); customerTable.deleteItem(deleteItemRequest);
带条件检查的交易写入 不能addConditionCheck方法中使用带@DynamoDBVersionAttribute注解的 Bean 类。 您可以在addConditionCheck生成器方法中使用带有@DynamoDbVersionAttribute注解的 bean 类来transactWriteItems处理请求。
禁用 通过将 DynamoDBMapperConfig.SaveBehavior枚举值从更改为来禁用乐观锁定UPDATECLOBBER

请勿使用@DynamoDbVersionAttribute注释。