Проблемы с параллельным доступом к данным

  • Потерянное обновление (lost update) - при одновременном изменении одного блока данных разными транзакциями теряются все изменения, кроме последнего;
  • “Грязное” чтение (dirty read) - чтение данных, добавленных или измененных транзакцией, которая впоследствии откатится;
  • Неповторяющееся чтение (non-repeatable read) - при повторном чтении в рамках одной транзакции ранее прочитанные данные оказываются измененными;
  • Фантомное чтение (phantom reads) - одна транзакция в ходе своего выполнения несколько раз выбирает множество строк по одним и тем же критериям. Другая транзакция в интервалах между этими выборками добавляет или удаляет строки или изменяет столбцы некоторых строк, используемых в критериях выборки первой транзакции, и успешно заканчивается. В результате получится, что одни и те же выборки в первой транзакции дают разные множества строк.

Уровни изоляции транзакций

Read uncommitted (чтение незафиксированных данных)

Гарантирует только отсутствие потерянных обновлений. Способ реализации - блокировка данных на время команды изменения (команды изменения одних и тех же строк фактически выполняются последовательно).

Read committed (чтение фиксированных данных)

Гарантирует отсутствие потерянных обновлений и грязного чтения.

Способы реализации - блокировка или версионность.

Repeatable read (повторяемость чтения)

Гарантирует отсутствие потерянных обновлений, грязного чтения и неповторяющееся чтение. Способ реализации - блокировка.

Serializable (упорядочиваемость)

Самый высокий уровень изолированности; транзакции полностью изолируются друг от друга, каждая выполняется последовательно, как будто параллельных транзакций не существует. Только на этом уровне параллельные транзакции не подвержены эффекту «фантомного чтения».