【问题标题】:Dynamodb versioing with dynamodb mapper is not working as expected使用 dynamodb 映射器的 Dynamodb 版本未按预期工作
【发布时间】:2018-12-31 22:51:51
【问题描述】:

尝试使用 dynamodb 映射器保存/更新项目时,我遇到了 conditionalcheckfailed 异常。

谁能分享一下使用java的sn-p代码,可以演示如何成功实现版本控制和乐观锁定?

尝试完全不设置版本! 尝试将记录添加到表中,然后在保存之前进行读取。

什么都没醒!!我继续收到 ConditionalCheckFailed 异常。 唯一有效的是,如果我将配置设置为 COBBLER!但这不是我想要的,因为我需要对数据进行乐观锁定。

数据库项目类---

@DynamoDBTable(tableName="Funds")
public class FundsItem {
    private String id;
    private String auditId;
    private Long version;
    private String shopId;
    private String terminalId;
    private String txId;

    @DynamoDBHashKey(attributeName = "Id")
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }

    @DynamoDBRangeKey(attributeName = "AuditId")
    public String getAuditId() {
        return auditId;
    }
    public void setAuditId(String auditId) {
        this.auditId = auditId;
    }

    @DynamoDBVersionAttribute(attributeName = "Version")
    public Long getVersion() { return version; }
    public void setVersion(Long version) { this.version = version; }


    @DynamoDBAttribute(attributeName = "ShopId")
    public String getShopId() {
        return shopId;
    }
    public void setShopId(String shopId) {
        this.shopId = shopId;
    }

    @DynamoDBAttribute(attributeName = "TerminalId")
    public String getTerminalId() { return terminalId; }
    public void setTerminalId(String terminalId) {
        this.terminalId = terminalId;
    }

    @DynamoDBAttribute(attributeName = "TxId")
    public String getTxId() {
        return txId;
    }
    public void setTxId(String txId) {
        this.txId = txId;
    }

   }

保存新项目的代码 -----

public long addFunds(FundsRequest request){

  FundsItem dbItem = new FundsItem();

  String Id = request.getShopId().trim() + request.getTerminalId().trim();
  String V0_Audit_Rec = "V0_Audit_" + Id;


        //save V0 item.
        dbItem.setVersion((long) 1);
        dbItem.setId(Id);
        dbItem.setAuditId(V0_Audit_Rec);
        dbItem.setShopId(request.getShopId().trim());
        dbItem.setTerminalId(request.getTerminalId().trim());
        dbItem.setTxId(request.getTxId().trim());

        mapper.save(dbItem);
}

请检查上面的 sn-p - 这是一个新的空表。 hashkey - id,rangekey - auditId,VersionField - 版本。

我只是希望能够添加一条新记录,这就是为什么在保存新项目之前不进行任何读取。如果我能得到这个简单的案例,即向 dynamodb 表工作添加新的 /first 记录,我也可以实现其余的用例。

【问题讨论】:

    标签: java amazon-dynamodb


    【解决方案1】:

    一般:

    1. 永远不要设置您的版本,如果需要,SDK 会初始化它。
    2. 始终尝试先使用您的密钥加载项目。如果返回 null,则创建项目并保存。否则更新返回的项目并保存。

    我知道您提到您已经尝试过上述方法。如果它确实是一个空表,您的代码应该可以正常工作(减去版本的设置)。

    我也会做几件事:

    • 不要使用自定义属性名称设置您的版本字段。理论上这应该没问题,但为了使您的代码与 AWS 示例相同,我会删除它,至少在您让它工作之前。
    • 虽然我认为您需要删除版本的设置,但我注意到您正在转换为 long,而不是 Long。同样,不太可能成为问题,但至少可以消除一些问题。即,如果您坚持设置版本,请使用 new Long(l)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-13
      • 1970-01-01
      • 2022-08-17
      • 1970-01-01
      • 1970-01-01
      • 2021-03-27
      • 1970-01-01
      • 2013-10-23
      相关资源
      最近更新 更多