Я пытаюсь обновить счетчик в моей простой базе данных (один ключ, одно числовое значение). Atomic counters кажутся естественными решениями, но мне нужны потокобезопасные обновления, т. Е. Мне нужно убедиться, что обновления не мешают друг другу.Безопасное обновление DynamoDb
This answer, кажется, предполагает, что мне нужно дважды проверить, что данные не были изменены другим обновлением перед выполнением фактической записи.
Мой вопрос в том, как я могу ссылаться на текущее значение в db в ConditionExpression
? Предполагая table
является dynamodb.Table
объект (Python API), это код, который я написал для update_item
:
table.update_item(
Key={
'key': my_key
},
UpdateExpression="set my_value = my_value + :inc",
ConditionExpression="my_value = ?????" # should be value in the db now
ExpressionAttributeValues={
':inc': my_increment,
},
ReturnValues="UPDATED_NEW"
)
Спасибо, это упрощает мою жизнь. Предполагая, что я также хочу убедиться, что обновление прошло успешно, как я могу это сделать? Я могу проверить снова после записи, но в этот момент кто-то другой мог бы изменить элемент. – meto
Пока вы получаете успешный ответ, вы знаете, что это удалось. Если он выдает ошибку, вы знаете, что произошла ошибка. Вы были бы не уверены в этом, если потеряете сетевое подключение или ваше приложение разбилось или что-то в этом роде. –