• 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 }
  • 相关阅读:
    并查集扩展域 —— [NOI2001]食物链
    C++ P4568 [JLOI2011]飞行路线 ---- Dijkstra+分层图
    单源最短路径--Dijkstra
    链式前向星学习
    深度理解链式前向星
    「学习笔记」链式前向星
    【转】到底EJB是什么
    什么是JPA
    把nc v6的源码看懂
    用友--扩展插件要怎么做
  • 原文地址:https://www.cnblogs.com/cloudrivers/p/11618677.html
Copyright © 2020-2023  润新知