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

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

适用于 Java 的 SDK 版本 1 和版本 2 之间的乐观锁差异

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

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

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

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

如果条件检查确认正在更新的对象的版本号与数据库中的版本号相匹配,则版本号属性会递增。

按照使用 @DynamoDbVersionAttribute(incrementBy = X) 设置的 incrementBy 选项来增加版本号属性。默认值是 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 注释为 transactWriteItems 请求使用 bean 类。
禁用 通过将 DynamoDBMapperConfig.SaveBehavior 枚举值从 UPDATE 更改为 CLOBBER 来禁用乐观锁。

不使用 @DynamoDbVersionAttribute 注释。