Уровни изоляции 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 (этот уровень изоляции, как показывает его название, гарантирует отсутствие феномена грязного чтения).