Каков общий способ решения параллельных обновлений в базе данных SQL?
Рассмотрим простую схему SQL (ограничения и значения по умолчанию не показаны), например
create table credits (
int id,
int creds,
int user_id
);
Цель состоит в том, чтобы хранить какие-то кредиты для пользователя, например. что-то вроде репутации stackoverflow.
Как работать с параллельными обновлениями этой таблицы? Несколько вариантов:
-
update credits set creds= 150 where userid = 1;
В этом случае приложение вернуло текущее значение, вычислило новое значение (150) и выполнило обновление. Это вызывает катастрофу, если кто-то другой делает то же самое в одно и то же время. Я предполагаю, что завершение обновления текущего значения и обновление в транзакции решат это, например.
Begin; select creds from credits where userid=1; do application logic to calculate new value, update credits set credits = 160 where userid = 1; end;
В этом случае вы можете проверить, будет ли новый кредит < 0 и просто усечь его до 0, если отрицательные кредиты не имеют смысла. -
update credits set creds = creds - 150 where userid=1;
В этом случае не нужно будет беспокоиться о параллельных обновлениях, поскольку БД заботится о проблеме согласованности, но имеет недостаток, что кредиторы с радостью станут отрицательными, что может не иметь смысла для некоторых приложений.
Так просто, какой принятый метод имеет дело с (довольно простой) проблемой, описанной выше, что, если db выдает ошибку?