1

Я пытаюсь обновить счетчик в моей простой базе данных (один ключ, одно числовое значение). 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" 
     ) 

ответ

2

Если вы просто хотите использовать Atomic счетчики, то вам не нужно состояние. Этот ответ, который вы связываете, просто цитирует документацию (которую вы также связываете), которая заявляет в некоторых чрезвычайно важных ситуациях, таких как увеличение баланса банковского счета, вы захотите использовать условное выражение, если не уверены, что первая попытка для увеличения. Например, если вы попытались увеличить значение и потерянное сетевое соединение, прежде чем получить ответ от DynamoDB. В этом случае вы не будете уверены, что это было успешно, и вам нужно будет повторить попытку с условием.

Вы заявляете, что вам нужны только потокобезопасные обновления, которые предоставляют Atomic Counters без использования условного выражения.

+0

Спасибо, это упрощает мою жизнь. Предполагая, что я также хочу убедиться, что обновление прошло успешно, как я могу это сделать? Я могу проверить снова после записи, но в этот момент кто-то другой мог бы изменить элемент. – meto

+0

Пока вы получаете успешный ответ, вы знаете, что это удалось. Если он выдает ошибку, вы знаете, что произошла ошибка. Вы были бы не уверены в этом, если потеряете сетевое подключение или ваше приложение разбилось или что-то в этом роде. –