Какие операции с БД являются одновременно «идемпотентными» и «коммутативными»? - PullRequest
5 голосов
/ 15 августа 2011

Я исследовал фреймворки / оболочки Scala DB и наткнулся на Gizzard из Твиттера. Сначала я был впечатлен, но остыл, когда прочитал ограничение. Они говорят, что все выполняемые вами операции с БД должны быть как идемпотентными , так и коммутативными. Если я правильно понимаю, это в основном не оставляет почти ничего. Как пример, если у меня есть объект с целочисленным счетчиком, и он должен быть увеличен. Я могу использовать либо операцию «увеличения», либо операцию «установки». Но приращение не будет идемпотентным (если вы запустите его дважды, вы получите другой результат, чем один раз), и set не будет коммутативным (установка первых 5, а затем 2 дает другой результат, чем установка первых двух, а затем 5). Итак, есть ли что-нибудь, кроме "insert-if-absent", что не очень полезно для большинства случаев использования. В чем смысл структуры распределенной базы данных, которая настолько ограничена, что вы в принципе не можете сделать с ней ничего полезного? Я, должно быть, упускаю что-то важное.

[EDIT] Помимо «insert-if-absent» (и «delete-if-present»), я думаю, что «compare-timestamp-and-set» будет и идемпотентным, и коммутативным, если изменится ставятся в очередь вместо отброшенного , когда «предыдущие изменения» все еще отсутствуют. Но я не знаю, реализует ли это какая-либо БД.

Ответы [ 2 ]

6 голосов
/ 15 августа 2011

В общем, идемпотентные действия должны проверять состояние перед действием.Применительно к контексту обновлений базы данных это означает проверку состояния данных, которые будут изменены перед обновлением.Например:

update some_table set
some_column = 'some_new_value'
where id = 123
and some_column = 'its_current_value'; -- idempotent check

Если бы он был выполнен дважды, второй вызов ничего бы не сделал.

Чтобы быть коммутативными, два обновления должны были бы повлиять на разные аспекты состояния данных (разные столбцы/ строк).То есть на действие каждой идемпотентной проверки не должно влиять действие обновления другой команды.

3 голосов
/ 28 октября 2011

Коммутативные операции - это просто операции, которые вызывают монотонное увеличение значения. Идемпотентные примеры указанных операций:

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