【问题标题】:Dynamodb ConditionalCheckFailedException attribute_not_exists or last_status_modify_time < :valDynamodb ConditionalCheckFailedException attribute_not_exists 或 last_status_modify_time < :val
【发布时间】:2020-01-11 02:18:48
【问题描述】:

我们使用这段代码来操作dynamodb:

  • 如果user_id不存在,代码将向dynamodb插入一条记录
  • 如果user_id确实存在并且modify_time字段(在项目中)last_status_modify_time(在我的代码中),它将更新这个项目的modify_time

大多数时候它是成功的,但有时它会抛出异常The conditional request failed (Service: AmazonDynamoDBv2; Status Code: 400; Error Code: ConditionalCheckFailedException。只是想知道我的条件表达式有问题吗? 这是我们的代码

private static void saveRoomStatusToDynamoDB(CacheClient client, ZRRoomItem item) {
    if (item == null) {
        return;
    }
    try {
        logger.debug("begin saveRoomStatusToDynamoDB, item: {}", item);
        String condition = String.format(
          "attribute_not_exists(%s) or %s < :val",
          DynamoConstants.FIELD_ZR_ROOM_ITEM_USER_ID,
          DynamoConstants.FIELD_ZR_ROOM_ITEM_LAST_STATUS_MODIFY_TIME);
        Map<String, Object> valueMap = new HashMap<>();
        valueMap.put(":val", item.getLastStatusModifyTime());

        //l_putItem will call dynamodb api
        boolean result = DynamoDBUtil.getInstance().l_putItem(
            DynamoConstants.TABLE_ZR_ROOM_ITEM, item.toDynamoItem(), 
            condition, valueMap);


    } catch (Exception e) {
        logger.error("saveRoomStatusToDynamoDB error, item: {}, {}",
          item, 
          WebLogger.printStackTrace(e));
    }
}

【问题讨论】:

    标签: amazon-dynamodb conditional-operator


    【解决方案1】:

    如果您尝试使用条件执行 putItem(),并且条件评估为 false,则不会执行更新并引发异常 (ConditionalCheckFailedException)。

    根据您的问题,我相信您预计当条件评估为 false 时,putItem() 调用只会正常返回。实际上它没有:它抛出了你得到的异常。因此,您只需要捕获异常并从您的方法返回。

    更多详情:https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Programming.Errors.html

    【讨论】:

    • 我的意思是有时我的代码会抛出 ConditionalCheckFailedException,但数据仍然可以保存或更新到 db。这很奇怪。理论上,如果有异常,putItem() 不会保存数据做db。所以想知道我的条件表达式有没有错。
    • @AnhuaZhao - 你如何保存数据?您可以针对这种情况发布一个示例(数据库中的数据,您要更新的数据)吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-23
    • 1970-01-01
    • 2022-11-15
    • 2020-05-02
    • 2017-08-13
    • 1970-01-01
    • 2011-05-01
    相关资源
    最近更新 更多