乐观锁 是一种确保正在更新(或删除)的客户端项目与 Amazon DynamoDB 中的项目相同的策略。如果您使用此策略,则将防止数据库写入由他人的写入覆盖,反之亦然。
注意
-
DynamoDB 全局表在并发更新之间使用“以最后写入者为准”原则。如果使用全局表,则以最后写入者策略为准。因此,在这种情况下,锁定策略无法按预期方式工作。
-
DynamoDBMapper 事务操作不支持乐观锁。
使用乐观锁时,每个项目都具有一个充当版本号的属性。如果您检索表中的项目,则应用程序会记录该项目的版本号。您可以更新该项目,但只有在服务器端的版本号没有改变时才能更新。如果存在版本不匹配,则意味着其他人在您之前修改了该项目。更新尝试会失败,这是因为您拥有的是该项目的过时版本。如果发生此情况,您只需通过检索项目然后尝试更新来重试。乐观锁可防止您意外覆盖他人所做的更改。它还可防止他人意外覆盖您所做的更改。为了支持乐观锁,AWS SDK for Java提供了 @DynamoDBVersionAttribute
注释。在适用于表的映射类中,您需要指定一个用于存储版本号的属性,并使用此注释对其进行标记。当您保存对象时,DynamoDB 表中对应的项目就会具有存储相应版本号的属性。DynamoDBMapper
会在您第一次保存对象时分配一个版本号,并且在每次更新项目时递增版本号的值。只有在客户端对象版本与 DynamoDB 表中对应的项目版本号相匹配时,您的更新或删除请求才会成功。
1 @DynamoDBTable(tableName="ProductCatalog") 2 public class CatalogItem { 3 4 private Integer id; 5 private String title; 6 private String ISBN; 7 private Set<String> bookAuthors; 8 private String someProp; 9 private Long version; 10 11 @DynamoDBHashKey(attributeName="Id") 12 public Integer getId() { return id; } 13 public void setId(Integer Id) { this.id = Id; } 14 15 @DynamoDBAttribute(attributeName="Title") 16 public String getTitle() { return title; } 17 public void setTitle(String title) { this.title = title; } 18 19 @DynamoDBAttribute(attributeName="ISBN") 20 public String getISBN() { return ISBN; } 21 public void setISBN(String ISBN) { this.ISBN = ISBN;} 22 23 @DynamoDBAttribute(attributeName = "Authors") 24 public Set<String> getBookAuthors() { return bookAuthors; } 25 public void setBookAuthors(Set<String> bookAuthors) { this.bookAuthors = bookAuthors; } 26 27 @DynamoDBIgnore 28 public String getSomeProp() { return someProp;} 29 public void setSomeProp(String someProp) {this.someProp = someProp;} 30 31 @DynamoDBVersionAttribute 32 public Long getVersion() { return version; } 33 public void setVersion(Long version) { this.version = version;} 34 }