У меня есть некоторый код, который выглядит как следующий «пониженный» пример:
UpdateItemRequest updateRequest = new UpdateItemRequest();
Map<String, ExpectedAttributeValue> expectedValues = Maps.newHashMap();
...
ExpectedAttributeValue expectedAttributeValue = new ExpectedAttributeValue(false);
expectedValues.put("my-attr", expectedAttributeValue);
UpdateItemResult updateItemResult = amazonDynamoDB.updateItem(updateRequest);
Если существует my-attr
, выдается ConditionalCheckFailedException
.
Из одной документации , ConditionalCheckFailedException
выдается, когда "условие, указанное в операции, не может быть оценено".
Из другой документации , "Если Exists имеет значение false, DynamoDB предполагает, что значение атрибута не существует в таблице. Если на самом деле значение не существует, то допущение является действительным, и операция успешно. Если значение найдено, несмотря на предположение, что оно не существует, операция завершается с условием исключения ConditionCheckFailedException ".
Кажется, существует противоречие между документами, так как операция действительно была правильно оценена, но не прошла.
Дело в том, что в коде я ожидал, что какое-то значение будет обновлено, если какое-то условие выполнено, и не будет обновлено, если условие не выполнено.
Звучит как вполне законное и ожидаемое поведение, так почему исключение?
Почему бы просто не добавить указание на то, было ли выполнено условие в UpdateItemResult
? Этот подход также будет соответствовать JDBC, где, если условие не будет выполнено, вы обновите ноль строк - не исключение.