Феномен потерянного обновления (англ. lost update) при параллельном выполнении транзакций заключается в том, что при одновременном изменении одного блока данных разными транзакциями теряются все изменения, кроме последнего. 4
Пример: есть две транзакции, которые одновременно изменяют значение поля f2. 4 По их завершении значение поля должно увеличиться на 45. 4 Но в реальности может возникнуть следующая последовательность действий: 4
- Обе транзакции одновременно читают текущее состояние поля. 4 Точная физическая одновременность здесь не обязательна, достаточно, чтобы вторая по порядку операция чтения выполнилась до того, как другая транзакция запишет свой результат. 4
- Обе транзакции вычисляют новое значение поля, прибавляя, соответственно, 20 и 25 к ранее прочитанному значению. 4
- Транзакции пытаются записать результат вычислений обратно в поле f2. 4 Поскольку физически одновременно две записи выполнить невозможно, в реальности одна из операций записи будет выполнена раньше, другая позже. 4 При этом вторая операция записи перезапишет результат первой. 4
- В результате значение поля f2 по завершении обеих транзакций может увеличиться не на 45, а на 20 или 25, то есть одна из изменяющих данные транзакций «пропадёт». 4
Проблема потерянного обновления возникает в системах с высоким уровнем параллелизма, где несколько потоков или процессов получают доступ к ресурсам. 1