Amazon dynamodb Dynamodb条件检查失败异常属性\u不存在\u或上次\u状态\u修改\u时间<;:瓦尔

Amazon dynamodb Dynamodb条件检查失败异常属性\u不存在\u或上次\u状态\u修改\u时间<;:瓦尔,amazon-dynamodb,conditional-operator,Amazon Dynamodb,Conditional Operator,我们使用此代码来操作dynamodb: 如果user\u id不存在,代码将向dynamodb插入一条记录 如果user\u id确实存在并且modify\u time字段(在项目中)

我们使用此代码来操作dynamodb:

  • 如果
    user\u id
    不存在,代码将向dynamodb插入一条记录
  • 如果
    user\u id
    确实存在并且
    modify\u time
    字段(在项目中)<
    last\u status\u modify\u time
    (在我的代码中),它将更新此项目的
    modify\u time
大多数情况下它是成功的,但有时它会抛出异常
条件请求失败(服务:AmazonDynamoDBv2;状态代码:400;错误代码: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));
    }
}
private static void saveRoomStatusToDynamoDB(CacheClient-client,ZRRoomItem项){
如果(项==null){
返回;
}
试一试{
debug(“begin saveRoomStatusToDynamoDB,item:{}”,item);
字符串条件=String.format(
“属性不存在(%s)或%s<:val”,
DynamoConstants.FIELD\u ZR\u ROOM\u ITEM\u USER\u ID,
动态恒量。字段(ZR、房间、项目、上次状态、修改时间);
Map valueMap=新的HashMap();
valueMap.put(“:val”,item.getLastStatusModifyTime());
//l_putItem将调用dynamodb api
布尔结果=DynamoDBUtil.getInstance().l_putItem(
DynamoConstants.TABLE_ZR_ROOM_ITEM,ITEM.toDynamoItem(),
条件、价值图);
}捕获(例外e){
error(“saveRoomStatusToDynamoDB错误,项:{},{}”,
项目,,
printStackTrace(e));
}
}

如果尝试使用条件执行
putItem()
,且条件的计算结果为false,则不会执行更新,并引发异常(
ConditionalCheckFailedException

根据您的问题,我相信您预期当条件的计算结果为false时,
putItem()
调用将正常返回。实际上并非如此:它会抛出您得到的异常。因此,您只需要捕获异常并从方法返回


进一步的细节:

我的意思是有时我的代码抛出ConditionalCheckFailedException,但数据仍然可以保存或更新到db。这很奇怪。理论上,如果有异常,putItem()不会将数据保存到数据库中。所以我想知道我的条件表达式是否错误。@AnhuaZhao-您如何确定数据可以保存?您能给出这种情况的示例(数据库中的数据,您要更新的数据)吗?