Рубрики
Без рубрики

Руководство для начинающих по аномалии грязного чтения

Грязное чтение – это аномалия целостности данных, которая может возникнуть, когда одна транзакция может считывать незафиксированные записи второй параллельной транзакции.

Автор оригинала: Vlad Mihalcea.

Транзакции базы данных определяются четырьмя свойствами, известными как ACID . Уровень изоляции (I в ACID) позволяет вам обменять целостность данных на производительность.

Чем слабее уровень изоляции, тем больше аномалий может произойти, и в этой статье мы опишем явление грязного чтения.

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

Принятие бизнес-решения по стоимости, которая не была зафиксирована, сопряжено с риском, поскольку незафиксированные изменения могут быть откатаны.

На приведенной выше диаграмме поток утверждений выглядит следующим образом:

  1. Алиса и Боб запускают две транзакции с базой данных.
  2. Алиса изменяет название данной записи записи.
  3. Боб читает незафиксированную запись .
  4. Если Алиса совершит свою транзакцию, все будет в порядке. Но если Алиса откатится, Боб увидит версию записи, которая больше не существует в журнале транзакций базы данных.

Эта аномалия разрешена только уровнем изоляции без ограничения чтения, и из-за влияния на целостность данных большинство систем баз данных предлагают более высокий уровень изоляции по умолчанию.

Чтобы предотвратить грязное чтение, компонент database engine должен скрывать незафиксированные изменения от всех других параллельных транзакций. Каждой транзакции разрешено видеть свои собственные изменения, потому что в противном случае гарантия согласованности чтения и записи будет нарушена.

Если базовая база данных использует 2PL (Двухфазную блокировку) , незафиксированные строки защищены блокировками записи, которые не позволяют другим параллельным транзакциям считывать эти записи до тех пор, пока они не будут зафиксированы.

Когда базовая база данных использует MVCC (Управление параллелизмом нескольких версий) , компонент database engine может использовать журнал отмены, в котором уже записана предыдущая версия каждой незафиксированной записи, для восстановления предыдущего значения в других запросах параллельных транзакций. Поскольку этот механизм используется на всех других уровнях изоляции (Фиксированное чтение, Повторяемое чтение, Сериализуемое), большинство систем баз данных оптимизируют процесс восстановления изображения перед восстановлением (снижая его накладные расходы на общую производительность приложения).

Обычно уровень изоляции с незафиксированным чтением редко требуется (запросы нестрогих отчетов, в которых допустимы грязные чтения), поэтому зафиксированное чтение обычно является самым низким практическим уровнем изоляции.

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