• 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 }
  • 相关阅读:
    centos8 将SSSD配置为使用LDAP并要求TLS身份验证
    Centos8 搭建 kafka2.8 .net5 简单使用kafka
    .net core 3.1 ActionFilter 拦截器 偶然 OnActionExecuting 中HttpContext.Session.Id 为空字符串 的问题
    Springboot根据不同环境加载对应的配置
    VMware Workstation12 安装 Centos8.3
    .net core json配置文件小结
    springboot mybatisplus createtime和updatetime自动填充
    .net core autofac依赖注入简洁版
    .Net Core 使用 redis 存储 session
    .Net Core 接入 RocketMQ
  • 原文地址:https://www.cnblogs.com/cloudrivers/p/11618677.html
Copyright © 2020-2023  润新知