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

Все операции в СУБД происходят параллельно, поэтому возникают побочные эффекты.

Побочные эффекты параллельного выполнения транзакций

  • Потерянное обновление (lost update).
  • «Грязное» чтение (dirty read).
  • Неповторяющееся чтение (non-repeatable read).
  • Фантомное чтение (phantom reads).

Потерянное обновление

При одновременном изменении одного блока данных разными транзакциями одно из изменений может теряться.

Пусть у нас в одной транзакции выполняется команда:

Во второй транзакции выполняется команда:

Обе транзакции увеличивают одно и то же поле. В результате поле должно быть увеличено на 13. В реальности может возникнуть ситуация, когда поле увеличится только на 3 или только на 10:

  1. Обе транзакции читают значение в поле.
  2. Обе транзакции вычисляют новое значение поля, прибавляя к вычитанному значению 10 и 3 соответственно.
  3. Транзакции пытаются записать значения. Физическая одновременность записи невозможна, поэтому сначала записывает одна транзакция, затем другая записывает результат поверх результата первой транзакции, что приводит к потере результата первой транзакции, то есть поле в конечном итоге будет увеличено только на 10, либо только на 3.

«Грязное» чтение

Грязное чтение возникает, когда считываются результаты другой транзакции, которая в последующем откатывается (rollback).

Транзакция 1 Транзакция 2

Неповторяющееся чтение

Возникает в ситуации, когда первая транзакция читает данные. Затем другая транзакция изменяет данные, считанные первой транзакцией и делает COMMIT. После чего первая транзакция снова пытается считать данные и получает совершенно другие значения. Подобная ситуация особенно неприемлема, когда данные считываются для частичного изменения и последующей фиксации в базе данных.

Фантомное чтение

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

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

  • read uncommited
  • read commited
  • repeatable read
  • serializable

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

Самый низший уровень изоляции. Гарантируется только отсутствие потерянных обновлений.

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

Большинство промышленных СУБД (Oracle, PostgreSQL, Microsoft SQL Server) используют этот уровень по умолчанию. Защищает от грязного чтения, но транзакции видят зафиксированные (commit) изменения друг друга.

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

При повторных чтениях считываются те же самые данные, что и при первом. Транзакция «не видит» изменения данных, которые уже были ей прочитаны. Однако транзакция видит данные, вставленные другими транзакциями, («фантомные») что может привести к считыванию больше числа строк, чем при первом считывании.

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

Самый высокий уровень изоляции. Все транзакции полностью изолируются друг от друга. Транзакции выполняются так, будто параллельных транзакций не существует.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *