Как атомарно увеличить числовой атрибут DynamoDB с верхним пределом и сбросить? - PullRequest
0 голосов
/ 22 октября 2019

Можно ли использовать DynamoDB для выполнения атомарного обновления числового атрибута таким образом, чтобы значение вернулось к некоторому предопределенному значению, когда оно достигнет некоторого предела, например, какой-либо операции по модулю?

Например, если мое начальное начальное значение равно 1, а верхний предел равен 3, значение будет увеличиваться на 1 при каждом обновлении, но когда выполняется приращение, и значение в настоящее время равно 3, тогда новое значение будетвернуться к единице.

Можно ли было бы сделать это атомарно с каким-то условием?

Ответы [ 2 ]

2 голосов
/ 22 октября 2019

Нет, в DynamoDB нет встроенного способа сделать это.

Я бы подумал просто обработать его как счетчик и выполнить арифметику по модулю клиента.

1 голос
/ 23 октября 2019

Jarmod действительно лучший ответ, когда вам нужно только по модулю. Но в других случаях использования вам может потребоваться более сложная логика, которая должна происходить во время записи, и, возможно, нет способа отложить ее до времени чтения.

В таких случаях вы можете использовать оптимистическая блокировка : клиент считывает старое значение, вычисляет новое значение по любой формуле и затем записывает новое значение обратно;Атомность достигается путем чтения номера версии из элемента и записи нового значения обратно с условием , что номер версии не изменился (если он изменился, вам нужно повторить процесс).

Когда конкуренция низка, оптимистическая блокировка только добавляет небольшую стоимость по сравнению с простым приращением счетчика (добавляет последовательное чтение, которое стоит меньше половины записи). Однако, если количество конфликтов велико, т. Е. Очень часто многие клиенты пытаются одновременно обновить одно и то же значение, повторные попытки могут значительно увеличить ваш счет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...