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

Уровни изоляции транзакций — это мера степени успешной изоляции транзакций. В частности, уровни изоляции транзакций определяются наличием или отсутствием следующих явлений:

  • Грязное чтение грязное происходит, когда транзакция считывает данные, которые еще не зафиксированы. Например, предположим, что транзакция 1 обновляет строку. Транзакция 2 считывает обновленную строку до фиксации обновления транзакцией 1. Если транзакция 1 откатывает изменение, транзакция 2 будет иметь данные чтения, которые никогда не существовали.

  • Невосстановимые операции чтения невосстановимыеоперации возникают, когда транзакция считывает одну и ту же строку дважды, но получает разные данные каждый раз. Например, предположим, что транзакция 1 считывает строку. Транзакция 2 обновляет или удаляет строку и фиксирует обновление или удаление. Если транзакция 1 перечитает строку, она извлекает различные значения строк или обнаруживает, что строка удалена.

  • ФантомыФантом — это строка, которая соответствует критериям поиска, но изначально не рассматривается. Например, предположим, что транзакция 1 считывает набор строк, удовлетворяющих некоторым критериям поиска. Транзакция 2 создает новую строку (с помощью обновления или вставки), которая соответствует условиям поиска для транзакции 1. Если транзакция 1 повторно извлекает инструкцию, которая считывает строки, она получает другой набор строк.

Четыре уровня изоляции транзакций (как определено SQL-92) определяются с точки зрения этих явлений. В следующей таблице помечает каждое явление, которое может произойти.

Уровень изоляции транзакций Чтение "грязных" данных Неизменяемые операции чтения Фантомы
Уровень изоляции read uncommitted X X X
Чтение подтверждено -- X X
Уровень изоляции repeatable read -- -- X
Упорядочиваемый уровень изоляции -- -- --

В следующей таблице описаны простые способы реализации уровней изоляции транзакций СУБД.

Важно!

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

Изоляция транзакций Возможная реализация
Уровень изоляции read uncommitted Транзакции не изолированы друг от друга. Если СУБД поддерживает другие уровни изоляции транзакций, он игнорирует любой механизм, который он использует для реализации этих уровней. Таким образом, они не негативно влияют на другие транзакции, транзакции, выполняемые на уровне "Несогласованное чтение", обычно доступны только для чтения.
Чтение подтверждено Транзакция ожидает, пока строки, заблокированные другими транзакциями, будут разблокированы; Это предотвращает чтение любых данных "грязное".

Транзакция содержит блокировку чтения (если она только считывает строку) или блокировку записи (если она обновляет или удаляет строку) в текущей строке, чтобы предотвратить обновление или удаление других транзакций. Транзакция освобождает блокировки чтения при перемещении текущей строки. Она сохраняет блокировки записи, пока не будет зафиксирована или откатена.
Уровень изоляции repeatable read Транзакция ожидает, пока строки, заблокированные другими транзакциями, будут разблокированы; Это предотвращает чтение любых данных "грязное".

Транзакция содержит блокировки чтения во всех строках, возвращаемые приложению, и записывает блокировки для всех строк, которые он вставляет, обновляет или удаляет. Например, если транзакция включает инструкцию SQL SELECT * FROM Orders, строки считывания транзакций блокируются в виде их получения приложением. Если транзакция включает инструкцию SQL DELETE FROM Orders WHERE Status = "CLOSED", строки записи транзакций блокируются по мере их удаления.

Так как другие транзакции не могут обновлять или удалять эти строки, текущая транзакция избегает каких-либо неустранимых операций чтения. Транзакция освобождает свои блокировки при фиксации или откате.
Упорядочиваемый уровень изоляции Транзакция ожидает, пока строки, заблокированные другими транзакциями, будут разблокированы; Это предотвращает чтение любых данных "грязное".

Транзакция содержит блокировку чтения (если она считывает только строки) или блокировку записи (если она может обновлять или удалять строки) в диапазоне строк, которые он влияет. Например, если транзакция включает инструкцию SQL SELECT * FROM Orders, диапазон представляет собой всю таблицу Orders. Транзакция считывает таблицу и не разрешает вставлять в нее новые строки. Если транзакция включает инструкцию SQL DELETE FROM Orders WHERE Status = "CLOSED", диапазон состоит из всех строк с состоянием "CLOSED"; транзакция записывает все строки в таблице "Заказы" с состоянием "CLOSED" и не позволяет вставлять или обновлять строки, чтобы результирующая строка имеет состояние "CLOSED".

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

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