- •Глава 13. Семантическое моделирование
- •Часть III Проектирование базы данных
- •Часть IV
- •14.1. Введение
- •14.2. Транзакции
- •14.3. Восстановление транзакции
- •14.4. Восстановление системы
- •14.5. Восстановление носителей
- •14.6. Двухфазная фиксация
- •14.7. Поддержка языка sql
- •14.8. Резюме
- •15.1. Введение
- •15.2. Три проблемы параллельности
- •15.3. Блокировка
- •15.4. Устранение трех проблем параллельности
- •15.5. Взаимная блокировка
- •15.6. Упорядочиваемость
- •15.7. Уровни изоляции
- •15.8. Блокировка намерения
- •15.9. Средства языка sql
- •15.10. Резюме
- •Часть V
- •16.1. Введение
- •16.2. Избирательная схема управления доступом
- •16.3. Мандатная схема управления доступом
- •16.4. Статистические базы данных
- •16.5. Шифрование данных
- •16.6. Средства языка sql
- •16.7. Резюме
- •17.1. Введение
- •17.2. Пример выполнения оптимизации
- •17.3. Оптимизация запросов
- •17.4. Преобразование выражений
- •17.5. Статистические показатели базы данных
- •17.6. Стратегия по принципу "разделяй и властвуй"
- •17.7. Реализация реляционных операторов
- •17.8. Резюме
- •18.1. Введение
- •18.2. Обзор концепции трехзначной логики
- •18.3. Некоторые следствия изложенной схемы
- •18.4. Отсутствующие значения и ключи
- •18.5. Внешнее соединение
- •18.6. Специальные значения
- •18.7. Поддержка неопределенных значений в языке sql
- •18.8. Резюме
- •Глава 19
- •19.1. Введение
- •19.2. Иерархия типов
- •19.3. Полиморфизм и заменимость
- •19.4. Переменные и операция присвоения
- •19.5. Специализация по ограничениям
- •19.6. Операции сравнения
- •19.7. Операторы, версии и сигнатуры
- •19.8. Является ли окружность эллипсом
- •19.9. Пересмотр специализации ограничением
- •19.10. Резюме
- •20.1. Введение
- •20.2. Предварительные сведения
- •20.3. Двенадцать основных целей
- •1. Локальная независимость
- •2. Отсутствие опоры на центральный узел
- •3. Непрерывное функционирование
- •4. Независимость от расположения
- •5. Независимость от фрагментации
- •6. Независимость от репликации
- •7. Обработка распределенных запросов
- •8. Управление распределенными транзакциями
- •9. Аппаратная независимость
- •10. Независимость от операционной системы
- •11. Независимость от сети
- •12. Независимость от типа субд
- •20.4. Проблемы распределенных систем
- •Транзакция т1х
- •20.5. Системы "клиент/сервер"
- •20.6. Независимость от субд
15.7. Уровни изоляции
Грубо говоря, термин уровень изоляции используется для описания степени вме- шательства параллельно выполняющихся транзакций в работу некоторой заданной транзакции. Однако для гарантированной упорядоченности используемых графиков за-
пуска нельзя допускать никакого постороннего вмешательства! Иначе говоря, уровень изоляции должен быть максимальным. Тем не менее, как уже отмечалось в конце преды- дущего раздела, в реальных системах по различным причинам обычно допускаются транзакции, которые работают на уровне изоляции ниже максимального.
Замечание. Уровень изоляции обычно рассматривается как некоторое свойство тран- закции. В действительности нет никаких причин, по которым транзакция в одно и то же время не могла бы работать с различными уровнями изоляции для разных частей базы данных. Однако из соображений простоты здесь уровень изоляции будет рассматривать- ся всего лишь как некоторое свойство транзакции.
Теоретически можно определить по крайней мере пять уровней изоляции. Однако в [15.9], а также в стандарте языка SQL их всего четыре, тогда как СУБД DB2 фирмы IBM поддержи- вает только два уровня. Вообще говоря, чем выше уровень изоляции, тем меньше степень возможного взаимного влияния транзакций (и ниже уровень параллельности), и чем ниже уровень изоляции, тем больше степень возможного взаимного влияния транзакций (и выше уровень параллельности работ в системе). В качестве примера рассмотрим два уровня изоля- ции, поддерживаемых СУБД DB2. Они называются уровнями стабильности курсора и по- вторяемости считывания. Уровень повторяемости считывания (ПС) является максималь- ным уровнем изоляции; причем если все транзакции выполняются на этом уровне, то графики запуска являются упорядоченными (выше в настоящей главе по умолчанию полагалось, что все транзакции выполняются именно на этом уровне изоляции). Уровень стабильности кур- сора (СК) для транзакции Tl характеризуется следующими особенностями:
транзакция адресуется некоторому кортежу t5;
это действие сопровождается установкой блокировки для кортежа t;
адресуемость кортежу t отменяется без его обновления;
в результате уровень Х-блокировки не достигается;
подобная блокировка может быть снята без необходимости ожидания окончания выполнения транзакции.
Обратите внимание, что в этом случае другая транзакция Т2 уже сможет выполнить обновление кортежа t и зафиксировать изменения. Если транзакция Т1 вновь обратится к кортежу t, эти изменения окажутся ей доступны, что в конечном счете может вызвать перевод базы данных в противоречивое состояние. В противоположность этому при ис- пользовании уровня изоляции ПС все блокировки кортежей (а не только Х-блокировки) должны сохраняться до окончания выполнения транзакции, поэтому упомянутой выше проблемы не возникает.
Здесь следует сделать важные дополнения.
5 Эта операция выполняется посредством установки курсора в положение, соответствую- щее требуемому кортежу (подробнее об этом речь шла в главе 4); отсюда и название уровня изоляции: "уровень стабильности курсора". Следует уточнить, что в СУБД DB2 блокировка Т1, установленная для кортежа t, является блокировкой для обновления (V-блокировкой), а не разде- ляемой блокировкой (S-блокировкой) [4.20].
1. Описанная проблема — не единственная из числа проблем, которые могут возникнуть на уровне изоляции СК; просто ее легче всего объяснить. Однако она, к сожалению, по- зволяет сделать вывод, что уровень изоляции ПС необходим только в тех сравнительно
маловероятных случаях, когда данная транзакция дважды обращается к одному и тому же кортежу. Тем не менее существуют весомые аргументы в защиту повсеместного ис- пользования уровня изоляции ПС вместо уровня СК. Дело в том, что выполнение тран- закции на уровне СК не является двухфазным, а потому (как разъяснялось в предыду- щем разделе) упорядоченность используемых в этом случае графиков не гарантируется. В качестве контраргумента следует указать тот факт, что на уровне изоляции СК в рабо- те системы достигается более высокий уровень параллельности в сравнении с уровнем изоляции ПС (такая ситуация возможна, но вовсе не обязательна).
2. Реализация, поддерживающая любой иной уровень изоляции, кроме максимально- го, обычно включает те или иные средства явного управления уровнем параллель- ности. Обычно для этого используется явное указание операторов блокировки LOCK, что позволяет разработчикам создавать свои приложения таким образом, чтобы гарантировать необходимую безопасность и при отсутствии гарантий со стороны самой системы. Например, в СУБД DB2 для этого предусмотрен оператор LOCK TABLE, который позволяет в приложениях с уровнем изоляции СК выполнить явную установку эксклюзивной блокировки данных, помимо тех блокировок, кото- рые система DB2 автоматически устанавливает для принудительного достижения этого уровня. (Обратите внимание, что в стандарте SQL нет никаких механизмов явного управления параллельностью; см. раздел 15.9.)
В заключение следует отметить, что предшествующая характеристика уровня повто- ряемости считывания как уровня максимальной изоляции относится только к реализации уровня ПС в СУБД DB2. К сожалению, в стандарте языка SQL тот же термин, "повторяемость считывания", используется для описания уровня изоляции, который на- ходится ниже максимального уровня (см. раздел 15.9).