DynamoDB 乐观锁

Posted Michael云擎的技术博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DynamoDB 乐观锁相关的知识,希望对你有一定的参考价值。

乐观锁 是一种确保正在更新(或删除)的客户端项目与 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 }

 

以上是关于DynamoDB 乐观锁的主要内容,如果未能解决你的问题,请参考以下文章

java中悲观锁和乐观锁的区别

悲观锁和乐观锁,啥情况

乐观锁的实现

数据库锁之乐观锁

多线程编程总结:四乐观锁悲观锁自旋锁

乐观锁与悲观锁