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

Явная инициация транзакции

Для явного образования транзакции поддерживается оператор START TRANSACTION, определяемый следующими синтаксическими правилами:

 

START TRANSACTION mode_commalist

 

Этот оператор очень похож на SET TRANSACTION. Единственное (хотя и очень существенное) отличие состоит в том, что выполнение оператора START TRANSACTION приводит не только к установке характеристик транзакции, но и к реальной инициации транзакции.

 

В стандарте SQL:1999 уровни изоляции определяются на основе нескольких феноменов, которые могут возникать при выполнении транзакций*.

 

Феномен грязного чтения (dirty read)

 

Этому феномену подвержены транзакции, в которых допускается возможность видеть изменения объектов базы данных, производимые одновременно выполняемыми и еще не другими зафиксированными транзакциями. Простой пример феномена грязного чтения показан на рис. 18.4.

 
 

 

 


Рис. 18.4. Феномен грязного чтения

 

На этом рисунке показано, что в момент времени t0 были образованы две транзакции T1 и T2. В момент времени t1 транзакция T1 успешно выполняет операцию модификации некоторого объекта базы данных O. В момент времени t2 (t2 > t1) транзакция T2 читает объект O, после чего успешно завершается в момент времени t3. Транзакция же T1 завершается в момент времени t4 (t4 > t3), причем в ней выполняется оператор ROLLBACK, что приводит к ликвидации в базе данных последствий изменения объекта O. В результате оказывается, что в транзакции T2 обрабатывались данные, которые реально не существуют в базе данных (отсюда и происходит термин грязные данные).

 

В SQL феномен грязного чтения может наблюдаться у транзакций, выполняемых на уровне изоляции READ UNCOMMITTED. Рекомендуется использовать этот уровень изоляции только в тех транзакциях, для выполнения функций которых точные данные не обязательны (например, в транзакциях, производящих статистическую обработку).

 

Феномен неповторяемого чтения (unrepeatable read)

 

Этому феномену подвержены транзакции, читающие некоторые объекты базы данных и допускающие изменения уже прочитанных объектов другими транзакциями. Пример феномена неповторяемого чтения показан на рис. 18.5.

 
 

 

 


Рис. 18.5. Феномен неповторяемого чтения

 

На этом рисунке показано, что в момент времени t0 были образованы две транзакции T1 и T2. В момент времени t1 транзакция T2 выполняет операцию чтения некоторого объекта базы данных O (например, производит выборку строки из таблицы с указанием значения первичного ключа). В момент времени t2 (t2 > t1) транзакция T1 изменяет объект O (модифицирует или даже удаляет). В момент времени t3 (t3 > t2) транзакция T2 повторно считывает объект O и обнаруживает, что он изменился или вовсе отсутствует. Другими словами, в транзакции T2 повторное выполнение выборки объекта базы данных O дало результат, отличный от результата первого выполнения (отсюда и происходит термин неповторяемое чтение).

 

В SQL феномен неповторяемого чтения может наблюдаться у транзакций, выполняемых на уровне изоляции READ COMMITTED (этот уровень изоляции, как показывает его название, гарантирует отсутствие феномена грязного чтения).