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

15.3. Блокировка

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

Ниже работа механизма блокировки описана более подробно.

1. Прежде всего предположим, что в системе поддерживается два типа блокировок: экс- клюзивная блокировка, или Х-блокировка, не допускающая совместного доступа, и разделяемая блокировка, или S-блокировка, разрешающая совместный доступ.

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

Замечание. Х- и S-блокировки иногда называют блокировками для записи и чте- ния соответственно. Здесь предполагается, что возможны только Х- и S-блокировки, хотя в разделе 15.8 приводятся примеры блокировок других типов. Кроме того, предпо- лагается, что единственным типом "блокируемого объекта" являются кортежи, хотя примеры других типов таких объектов описаны, опять же, в разделе 15.8.

  1. Если транзакция А заблокировала кортеж t без возможности взаимного доступа (X- блокировка), то запрос другой транзакции В на блокировку этого же кортежа t бу- дет отменен.

  2. Если транзакция А заблокировала кортеж 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.

  1. Прежде чем считать какой-либо кортеж, транзакция должна установить для него S- блокировку.

  2. Прежде чем обновить какой-либо кортеж, транзакция должна установить для него Х-блокировку. Если транзакция уже установила для кортежа S-блокировку (что возможно в случае последовательного выполнения операций Retrieve и Update), необходимо расширить S-блокировку до уровня Х-блокировки.

Замечание. В транзакциях запросы на установку блокировки обычно задаются не- явным образом; например, запрос на выборку кортежа подразумевает неявный за- прос на установку для него S-блокировки, а запрос на обновление кортежа — неяв- ный запрос на установку для него Х-блокировки. При этом под термином "обновление" (как и ранее) подразумеваются, помимо операций UPDATE, также опе- рации INSERT (вставка) и DELETE (удаление). При строгом описании протокола имеют место небольшие отличия, связанные с выполнением операций вставки и удаления, однако здесь они опущены.

2 Описываемый здесь протокол является примером протокола двухфазной блокировки (более подробно он рассматривается в разделе 15 б)


  1. Если запрашиваемая со стороны транзакции В блокировка отвергается из-за конфликта с блокировкой, уже установленной со стороны транзакции А, то транзакция В перево- дится в состояние ожидания. Причем транзакция В будет находиться в состоянии ожи- дания до тех пор, пока не будет снята блокировка, установленная ранее транзакцией А. Замечание. Система обязательно должна гарантировать, что транзакция В не бу- дет находиться в состоянии ожидания бесконечно долго (иногда эту ситуацию называют зависанием). Самым простым способом получения подобной гарантии является организация обработки запросов на блокировку по принципу "первым поступил — первым обработан".

  2. Х-блокировки сохраняются вплоть до конца выполнения установившей их транзак- ции (до ее фиксации (COMMIT) или отката (ROLLBACK)). S-блокировки также обычно сохраняются вплоть до окончания транзакции, однако в этом случае следует учесть замечания, изложенные в разделе 15.7.

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