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

 

Блокировки предотвращают потерю изменений при параллельной обработке данных. Но существует ряд проблем, которые нельзя решить с помощью блокировок: «грязное чтение», «невоспроизводимое (неповторяемое) чтение», «фантомное чтение».

1 «Грязное чтение» (dirty reads). Одна транзакция изменяет некоторые данные, но еще не завершается. Другая транзакция читает эти же данные (с изменениями, внесенными первой транзакцией) и принимает на их основе какие—то решения. Первая транзакция выполняет откат. В результате решение, принятое второй транзакцией будет основано на неверных данных.

2 «Невоспроизводимое (неповторяемое) чтение» (nonrepeatable reads). Одна транзакция в ходе своего выполнения несколько раз читает одни и те же данные Д. Другая транзакция в интервалах между этими чтениями изменяет данные Д и успешно заканчивается. В результате получится, что чтения, осуществляемые первой транзакцией,дают разные результаты.

3 «Фантомное чтение» (phantoms reads). Одна транзакция в ходе своего выполнения несколько раз выбирает множество строк по одним и тем же критериям. Другая транзакция в интервалах между этими выборками добавляет или удаляет строки или изменяет столбцы некоторых строк, используемых в критериях выборки первой транзакции, и успешно заканчивается. В результате получится, что одни и те же выборки в первой транзакции дают разные множества строк.

Для определения допустимости тех или иных проблем можно определить уровни изоляции транзакций. Такие настройки можно сделать как в среде многопользовательской СУБД, так и в среде разработки приложений. Например, в среде Delphi установка уровней изоляции транзакций определяется свойством компонента Tdatabase property TransIsolation: TtransIsolation. Разработчик может указать желаемый уровень, а СУБД будет управлять транзакциями в соответствии с этими указаниями.

Уровни изоляции транзакций определяют:

— могут ли другие (конкурирующие транзакции) вносить изменения в данные, изменяемые текущей транзакцией;

— может ли текущая транзакция видеть изменения, произведенные конкурирующими транзакциями и наоборот.

В стандарте языка SQL от 1992 года определяется четыре уровня изоляции для транзакций. Каждый уровень изоляции определяет действия, которые недопустимы при выполнении параллельных транзакций. Более высокие уровни изоляции включают все ограничения, установленные на более низких уровнях.

1 Уровень изоляции Read Uncommetted (RU) — незавершенное, грязное чтение. На этом уровне запрещается изменение данных со стороны других транзакций, если эти данные модифицируются еще не окончившейся транзакцией. Иначе говоря, другие транзакции блокируются по записи для этих данных до тех пор, пока не окончится текущая транзакция. Однако другим транзакциям разрешается считывать еще не подтвержденные данные, что классифицируется как «грязное чтение».

2 Уровень Read Commetted (RC) — чтение данных. На этом уровне запрещается грязное чтение.

3 Repeatable Reads (RR) — воспроизводимое чтение. На этом уровне запрещается «грязное чтение» и «невоспроизводимое (неповторяемое) чтение».

4 Serializable (S) — сериализуемость. На этом уровне запрещается «фантомное чтение».

В таблице 30 приведены уровни изоляции транзакций и проблемы, которые они решают.

Таблица 30 – Уровни изоляции

Тип Проблемы Уровень изоляции
RU RC RR S
Грязное чтение Возможно Невозможно Невозможно Невозможно
Невоспроиз—водимое чтение Возможно Возможно Невозможно Невозможно
Фантомное чтение Возможно Возможно Возможно Невозможно

 

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