- •Глава 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.3. Блокировка
Как упоминалось в разделе 15.1, описанные в предыдущем разделе проблемы могут быть разрешены с помощью механизма управления параллельным выполнением процес- сов, называемого блокировкой. Основная идея очень проста: в случае, когда при вы- полнении некоторой транзакции необходимо иметь гарантии, что определенный объект базы данных (обычно это кортеж) не будет непредсказуемо изменен без ведома данной транзакции (как это имело место выше), требуемый объект блокируется. Эффект вы- полнения блокировки состоит в том, что доступ к объекту со стороны других транзакций запрещается, а это позволяет предотвратить его неконтролируемое изменение. В резуль- тате установившая блокировку транзакция сможет выполнять всю необходимую обра- ботку, имея полную гарантию, что обрабатываемый объект будет оставаться в неизмен- ном состоянии настолько долго, насколько потребуется.
Ниже работа механизма блокировки описана более подробно.
1. Прежде всего предположим, что в системе поддерживается два типа блокировок: экс- клюзивная блокировка, или Х-блокировка, не допускающая совместного доступа, и разделяемая блокировка, или S-блокировка, разрешающая совместный доступ.
В отношении этой возможности (т.е. записи результатов в базу данных) предполагается, что не существует никаких ограничений целостности, запрещающих подобную запись.
Замечание. Х- и S-блокировки иногда называют блокировками для записи и чте- ния соответственно. Здесь предполагается, что возможны только Х- и S-блокировки, хотя в разделе 15.8 приводятся примеры блокировок других типов. Кроме того, предпо- лагается, что единственным типом "блокируемого объекта" являются кортежи, хотя примеры других типов таких объектов описаны, опять же, в разделе 15.8.
Если транзакция А заблокировала кортеж t без возможности взаимного доступа (X- блокировка), то запрос другой транзакции В на блокировку этого же кортежа t бу- дет отменен.
Если транзакция А заблокировала кортеж t с возможностью взаимного доступа (S- блокировка), то:
запрос со стороны некоторой транзакции В на выполнение Х-блокировки корте- жа t будет отвергнут;
запрос со стороны некоторой транзакции В на выполнение S-блокировки кортежа t будет принят (т.е. для транзакции В также будет установлена S-блокировка кор- тежа t).
Эти правила можно наглядно представить в виде матрицы совместимости типов бло- кировок, показанной на рис. 15.5. Эта матрица интерпретируется следующим образом. Рас- смотрим некоторый кортеж t и предположим, что транзакция А блокирует кортеж t раз- личными типами блокировки (что обозначено в заголовках столбцов соответственно сим- волами S и X, тогда как отсутствие блокировки — прочерком). Предположим также, что некоторая транзакция В запрашивает блокировку кортежа t, тип которой на рис. 15.5 указан
в первом слева столбце матрицы. (Для полноты картины в таблице также приведен случай отсутствия блокировки.) В остальных ячейках матрицы символ N отмечает конфликтную ситуацию (запрос со стороны транзакции В не может быть удовлетворен, и эта транзакция переводится в состояние ожидания), a Y— допустимую ситуацию (запрос со стороны транзакции В удовлетворяется). Очевидно, что данная матрица является симметричной.
|
X |
S |
|
X |
N |
N |
Y |
S |
N |
Y |
Y |
— |
Y |
Y |
Y |
Рис. 15.5. Матрица совместимости для Х- и S-блокировок
Теперь следует ввести понятие протокол доступа к данным (или протокол блоки- ровки), который с помощью описанных выше Х- и S-блокировок позволит избежать возникновения проблем, обсуждавшихся в разделе 15.22.
Прежде чем считать какой-либо кортеж, транзакция должна установить для него S- блокировку.
Прежде чем обновить какой-либо кортеж, транзакция должна установить для него Х-блокировку. Если транзакция уже установила для кортежа S-блокировку (что возможно в случае последовательного выполнения операций Retrieve и Update), необходимо расширить S-блокировку до уровня Х-блокировки.
Замечание. В транзакциях запросы на установку блокировки обычно задаются не- явным образом; например, запрос на выборку кортежа подразумевает неявный за- прос на установку для него S-блокировки, а запрос на обновление кортежа — неяв- ный запрос на установку для него Х-блокировки. При этом под термином "обновление" (как и ранее) подразумеваются, помимо операций UPDATE, также опе- рации INSERT (вставка) и DELETE (удаление). При строгом описании протокола имеют место небольшие отличия, связанные с выполнением операций вставки и удаления, однако здесь они опущены.
2 Описываемый здесь протокол является примером протокола двухфазной блокировки (более подробно он рассматривается в разделе 15 б)
Если запрашиваемая со стороны транзакции В блокировка отвергается из-за конфликта с блокировкой, уже установленной со стороны транзакции А, то транзакция В перево- дится в состояние ожидания. Причем транзакция В будет находиться в состоянии ожи- дания до тех пор, пока не будет снята блокировка, установленная ранее транзакцией А. Замечание. Система обязательно должна гарантировать, что транзакция В не бу- дет находиться в состоянии ожидания бесконечно долго (иногда эту ситуацию называют зависанием). Самым простым способом получения подобной гарантии является организация обработки запросов на блокировку по принципу "первым поступил — первым обработан".
Х-блокировки сохраняются вплоть до конца выполнения установившей их транзак- ции (до ее фиксации (COMMIT) или отката (ROLLBACK)). S-блокировки также обычно сохраняются вплоть до окончания транзакции, однако в этом случае следует учесть замечания, изложенные в разделе 15.7.