Я пытаюсь использовать PutItem
для выполнения условной записи данных в Dynamodb, если данные в определенном поле отсутствуют или данные соответствуют известной строке.
Я пытаюсь реализовать операцию счетчика atomi c в Dynamodb, так как существует небольшая вероятность того, что запись может быть изменена другим процессом. Данные считываются из DDB, часть записи изменяется, а затем предпринимается попытка записи, и я хочу, чтобы запись была успешной только в том случае, если данные в точке записи совпадают с исходным значением, считанным из базы данных ( или если изначально не было данных).
PutItemRequest request = PutItemRequest.builder()
.tableName(DDB_TABLE_NAME)
.item(itemValues)
.conditionExpression("attribute_not_exists(#DATA) OR #DATA = :oldEnvReleaseStatus")
.expressionAttributeNames(Map.of("#DATA", DATA))
.expressionAttributeValues(Map.of(
":oldEnvReleaseStatus",
AttributeValue.builder()
.s(objectMapper.writeValueAsString(oldEnvReleaseStatus))
.build()))
.build();
Значения, которые меня интересуют, это JSON строки:
Old env release status that we will overwrite: {"status":"INITIATED","instanceReleaseStatusesByInstanceRelease":{"monolith":{"status":"INITIATED","releasedAt":"2020-05-26T20:52:18.794032Z"}},"releasedAt":"2020-05-26T20:52:18.793910Z"}
Attempting to overwrite env release status with {"status":"RELEASE_IN_PROGRESS","instanceReleaseStatusesByInstanceRelease":{"monolith":{"status":"INITIATED","releasedAt":"2020-05-26T20:52:18.794032Z"}},"releasedAt":"2020-05-26T20:52:18.793910Z"}
Данные в DATA
поле в базе данных выглядит так, когда я просматриваю в Dynamodb (DDB экранирует кавычки в GUI):
data String: {\"status\":\"INITIATED\",\"instanceReleaseStatusesByInstanceRelease\":{\"monolith\":{\"status\":\"INITIATED\",\"releasedAt\":\"2020-05-26T20:52:18.794032Z\"}},\"releasedAt\":\"2020-05-26T20:52:18.793910Z\"}
Значение в поле данных в DDB кажется таким же, как используемое при условии (т.е. данные не изменились, и поэтому я думаю, что запись должна быть завершена с go), но при попытке записи я получаю ConditionalCheckFailedException
. Что я делаю не так?