«Моя проблема здесь в том, чтобы иметь возможность прочитать правильное непротиворечивое значение и обновить правильное значение.»
Для чтения / записи правильного согласованного значения
- Считывание согласованности в DynamodB (вы можете установить его в своем запросе как параметр ConsistentRead):
- Существует два типа чтения.
- Окончательно согласованное чтение : если вы читаете данные после изменений в таблице, это может оказаться устаревшим и немного подождать, чтобы быть согласованным.
- Строго согласованные данные : он возвращает самые последние данные, поэтому не стоит беспокоиться об устаревших данных
- ConditionExpression (укажите в своем запросе):
- в вашем запросе вы можете указать, что обновлять значение, если некоторые условия выполняются (например, текущее значение в db совпадает со значением, которое вы прочитали ранее. Это означает, что никто не обновлял его между), в противном случае он возвращает ConditionalCheckFailedException, и вам нужно чтобы обработать это в вашем коде, чтобы повторить, ...
Итак, , чтобы ответить на ваш вопрос , сначала вам нужно быть полностью последовательным, чтобы получить текущее значение счетчика в дБ. Затем, чтобы обновить его, ваш запрос должен выглядеть следующим образом (удалены ненужные параметры), и вы должны обработать исключение ConditionalCheckFailedException в вашем коде:
"TableName": "counters",
"ReturnValues": "UPDATED_NEW",
"ExpressionAttributeValues": {
":a": currentValue,
":bb": newValue
},
"ExpressionAttributeNames": {
"#currentValue": "currentValue"
},
**// current value is what you ve read
// by Strongly Consistent **
"ConditionExpression": "(#currentValue = :a)",
"UpdateExpression": "SET #currentValue = :bb", // new counter value