Поделиться через


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

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

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

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

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

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

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

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

Это важно

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

Изоляция транзакций Возможная реализация
Уровень изоляции read uncommitted Транзакции не изолированы друг от друга. Если СУБД поддерживает другие уровни изоляции транзакций, он игнорирует любой механизм, который он использует для реализации этих уровней. Чтобы не влиять негативно на другие транзакции, транзакции, выполняемые на уровне "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". Транзакция ставит блокировку на запись всех строк в таблице Orders со статусом "CLOSED" и не позволяет вставлять или обновлять строки таким образом, чтобы результирующая строка имела статус "CLOSED".

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

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