Вопрос проверяет понимание проблем конкурентного доступа и изоляции транзакций.
Lost update — это ситуация, когда одна транзакция перезаписывает изменения другой, не учитывая их. Это происходит, когда несколько транзакций читают одно значение и затем записывают новое. Если нет механизма блокировок или версионирования, одно обновление теряется. Такая проблема возникает при низких уровнях изоляции.
Lost update — это одна из аномалий конкурентного доступа.
Сценарий:
Транзакция A читает значение = 10
Транзакция B читает значение = 10
A записывает 15
B записывает 12
Результат:
обновление A потеряно
Чаще всего:
при уровне изоляции Read Committed
при отсутствии блокировок
при обновлениях по прочитанному значению
Используют:
SELECT FOR UPDATE
оптимистическую блокировку
более высокий уровень изоляции
Пример:
SELECT * FROM account WHERE id=1 FOR UPDATE;
Особенно важно:
финансы
счётчики
складские остатки
Lost update возникает, когда параллельные транзакции обновляют одни и те же данные без координации, и одно из изменений теряется.