Скачиваний:
82
Добавлен:
02.05.2014
Размер:
2.28 Mб
Скачать

15.9. Средства языка sql

В стандарте языка SQL не предусмотрена явная поддержка каких-либо функций блоки- ровки (фактически понятие блокировки в нем вообще не упоминается). Однако реализация подобных средств необходима для получения гарантий исключения конфликтных ситуаций между транзакциями, выполняющимися параллельно. Точнее говоря, требуется, чтобы об- новления, выполняемые некоторой транзакцией Т1, не были доступны любой другой транзак- ции Т2 до тех и обязательно до тех пор, пока не будет завершено выполнение транзакции Т1. Фиксация транзакции открывает доступ ко всем обновлениям, выполненным данной транзак- цией. Откат транзакции приводит к тому, что все выполненные ею обновления отменяются.

Замечание. Сказанное выше относится к случаю, когда все транзакции выполняются на уровне изоляции READ COMMITTED (чтение зафиксированного), REPEATABLE READ (повторяемое чтение) и SERIALIZABLE (упорядочиваемость). К транзакциям, выполняе- мым на уровне изоляции READ UNCOMMITTED (чтение незафиксированного), применяются особые соглашения, допускающие "некорректное чтение" (об этом речь идет ниже), но только в режиме READ ONLY (только чтение); подробности приводятся в главе 14.

Уровни изоляции

6 В данном случае ключевое слово SERIALIZABLE является не совсем удачным, поскольку этот термин подразумевает упорядочиваемость графиков запуска, а не транзакций. Более удач- ным был бы вариант TWO PHASE, который означает выполнение транзакции (возможно, прину- дительное) в соответствии с требованиями протокола двухфазной блокировки.

В главе 14 уже упоминался оператор языка SQL SET TRANSACTION, предназначенный для указания определенных характеристик запускаемой на выполнение транзакции. Од- ной из таких характеристик является уровень изоляции. Существуют следующие уровни изоляции: READ COMMITTED (чтение зафиксированного), REPEATABLE READ (повторяемое чтение) и SERIALIZABLE (упорядочиваемость)6. По умолчанию устанавливается уровень SERIALIZABLE, однако, если задан один из трех остальных уровней, при реализации все- гда можно использовать более высокий уровень, где выражение "более высокий" подра- зумевает следующее соотношение уровней: SERIALIZABLE > REPEATABLE READ > READ COMMITTED > READ UNCOMMITTED.

Если все транзакции выполняются на уровне изоляции SEEIALIZABLE (принимаемом по умолчанию), то график выполнения любого множества параллельных транзакций с чередованием их операций будет гарантированно упорядоченным. Однако если некото- рая транзакция выполняется на более низком уровне изоляции, то упорядоченность гра- фика может быть нарушена самыми разными способами. В данном стандарте указаны три особых случая нарушения упорядочиваемости.

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

  • Неповторяемое чтение. Допустим, что транзакция Т1 считывает некоторую стро- ку, затем транзакция Т2 ее обновляет, после чего транзакция Т1 вновь считывает эту же строку. В результате транзакция Т1 считает два совершенно разных значе- ния одной и той же строки.

  • Чтение фантомов. Допустим, что транзакция Т1 считывает множество всех строк, удовлетворяющих некоторому заданному условию (например, строки всех поставщиков из Парижа). Допустим также, что транзакция Т2 вставляет в таблицу новую строку, которая удовлетворяет этому же условию. Если транзакция Tl вновь повторит ту же операцию выборки, что и раньше, то ею будет обнаружена ранее отсутствовавшая строка — "фантом" (phantom).

Различные уровни изоляции определяются в терминах приведенных выше случаев нарушения упорядоченности. Соответствующие определения схематически представле- ны на рис. 15.13.

Уровень изоляции

Некорректное чтение

Неповторяемое чтение

Чтение фантомов

READ UNCOMMITTED

Y

Y

Y

READ COMMITTED

N

Y

Y

REPEATABLE READ

N

N

Y

SERIALIZABLE

N

N

N

Рис. 15.13. Уровни изоляции языка SQL

Возникает очевидный вопрос: "Каким же образом система сможет предотвратить по- явление фантомов?". Для этого в ней должна быть предусмотрена блокировка пути дос- тупа к данным. Если в приведенном выше примере с поставщиками из Парижа путем доступа к данным служит индекс по городам поставщиков, то система должна будет за- блокировать строку этого индекса, относящуюся к Парижу. Благодаря такой блокировке фантомы возникнуть не смогут, поскольку для их появления потребуется обратиться к данному пути доступа (т.е. в приведенном примере — к конкретному значению индекса). Более подробно этот вопрос рассматривается в [14.12].

В заключение следует повторить, что определения уровня изоляции REPEATABLE READ в стандарте языка SQL и в СУБД DB2 являются совершенно разными. На самом деле уровню REPEATABLE READ в СУБД DB2 соответствует уровень SERIALIZABLE в стандарте языка SQL.

Соседние файлы в папке Дейт К. Дж. Введение в системы баз данных [7 издание]