|
Программирование >> Хронологические базы данных
верный результат. Кроме того, следует учитывать, что откат транзакции В может произойти не по вине транзакции В, а, например, в результате сбоя системы. (К этому времени выполнение транзакции А может быть уже завершено, а потому сбой системы не приведет к откату транзакции А.) Второй пример, приведенный на рис. 15.3, иллюстрирует еще более неприятный случай. В момент t2 транзакция А вновь оказывается зависимой от незафиксированного изменения. Более того, в момент t3 все ее результаты фактически утрачиваются, поскольку откат транзакции В приводит к восстановлению исходного состояния кортежа t, которое он имел в момент tl. Это еще один вариант проблемы потери результатов обновления. Проблема несогласованной обработки данных На рис. 15.4 показаны транзакции А и В, которые обрабатывают кортежи, содержащие сведения об остатках на счетах (АСС). При этом транзакция А суммирует текущие остатки на счетах, а транзакция В выполняет перевод суммы в $10 со счета 3 на счет 1. Полученный в итоге выполнения транзакции А результат $110, очевидно, неверен, и если он будет помещен в базу данных, то она окажется в противоречивом состоянии. В таком случае говорят, что транзакция А выполняет несогласованную обработку данных, в результате чего получается противоречивый результат. Обратите внимание на следующее отличие этого примера от предыдущего: здесь не идет речь о зависимости транзакции А от незафиксированных результатов транзакции В, так как последняя выполнила и зафиксировала все свои обновления до того, как транзакция А считала значение остатка для счета АСС 3. 15.3. Блокировка Как упоминалось в разделе 15.1, описанные в предыдущем разделе проблемы могут быть разрешены с помощью механизма управления параллельным выполнением процессов, называемого блокировкой. Основная идея очень проста: в случае, когда при выполнении некоторой транзакции необходимо иметь гарантии, что определенный объект базы данных (обычно это кортеж) не будет непредсказуемо изменен без ведома данной транзакции (как это имело место выше), требуемый объект блокируется. Эффект выполнения блокировки состоит в том, что доступ к объекту со стороны других транзакций запрещается, а это позволяет предотвратить его неконтролируемое изменение. В результате установившая блокировку транзакция сможет выполнять всю необходимую обработку, имея полную гарантию, что обрабатываемый объект будет оставаться в неизменном состоянии настолько долго, насколько потребуется. Ниже работа механизма блокировки описана более подробно. 1. Прежде всего предположим, что в системе поддерживается два типа блокировок: эксклюзивная блокировка, или Х-блокировка, не допускающая совместного доступа, и разделяемая блокировка, или S-блокировка, разрешающая совместный доступ. В отношении этой возможности (т.е. записи результатов в базу данных) предполагается, что не существует никаких ограничений целостности, запрещающих подобную запись. АСС 1 АСС 2 АСС 3 40 50 30 Транзакция А Время Транзакция В Извлечение кортежа АСС 1: tl - sum =40 I - Извлечение кортежа АСС 2: t2 - sum =90 I - - t3 Извлечение кортежа АСС 3: - t4 Обновление кортежа АСС 3: - I 30 20 - t5 Извлечение кортежа АСС 1: - t6 Обновление кортежа АСС 1: - I 40 50 - tl Фиксация результатов транзакции Извлечение кортежа АСС 3: t8 sum = 110 (а не 120) i Рис. 15.4. Транзакция А получша противоречивый результат Замечание. Х- и S-блокировки иногда называют блокировками для записи и чтения соответственно. Здесь предполагается, что возможны только Х- и S-блокировки, хотя в разделе 15.8 приводятся примеры блокировок других типов. Кроме того, предполагается, что единственным типом блокируемого объекта являются кортежи, хотя примеры других типов таких объектов описаны, опять же, в разделе 15.8. 2. Если транзакция А заблокировала кортеж t без возможности взаимного доступа (X-блокировка), то запрос другой транзакции В на блокировку этого же кортежа t будет отменен. 3. Если транзакция А заблокировала кортеж t с возможностью взаимного доступа (S-блокировка), то: запрос со стороны некоторой транзакции В на выполнение Х-блокировки кортежа t будет отвергнут; запрос со стороны некоторой транзакции В на выполнение S-блокировки кортежа t будет принят (т.е. для транзакции В также будет установлена S-блокировка кортежа t). Эти правила можно наглядно представить в виде матрицы совместимости типов блокировок, показанной на рис. 15.5. Эта матрица интерпретируется следующим образом. Рассмотрим некоторый кортеж t и предположим, что транзакция А блокирует кортеж t различными типами блокировки (что обозначено в заголовках столбцов соответственно символами S и X, тогда как отсутствие блокировки - прочерком). Предположим также, что некоторая транзакция В запрашивает блокировку кортежа t, тип которой на рис. 15.5 указан в первом слева столбце матрицы. (Для полноты картины в таблице также приведен случай отсутствия блокировки.) В остальных ячейках матрицы символ N отмечает конфликтную ситуацию (запрос со стороны транзакции В не может быть удовлетворен, и эта транзакция переводится в состояние ожидания), а Y - допустимую ситуацию (запрос со стороны транзакции В удовлетворяется). Очевидно, что данная матрица является симметричной. X S - X N N Y S N Y У - Y Y У Рис. 15.5. Матрица совместимости для Х- и S-блокировок Теперь следует ввести понятие протокол доступа к данным (или протокол блокировки), который с помощью описанных выше Х- и S-блокировок позволит избежать возникновения проблем, обсуждавшихся в разделе 15.2. 1. Прежде чем считать какой-либо кортеж, транзакция должна установить для него S-блокировку. 2. Прежде чем обновить какой-либо кортеж, транзакция должна установить для него Х-блокировку. Если транзакция уже установила для кортежа S-блокировку (что возможно в случае последовательного выполнения операций Retrieve и Update), необходимо расширить S-блокировку до уровня Х-блокировки. Замечание. В транзакциях запросы на установку блокировки обычно задаются неявным образом; например, запрос на выборку кортежа подразумевает неявный запрос на установку для него S-блокировки, а запрос на обновление кортежа - неявный запрос на установку для него Х-блокировки. При этом под термином обновление (как и ранее) подразумеваются, помимо операций UPDATE, также операции INSERT (вставка) и DELETE (удаление). При строгом описании протокола имеют место небольшие отличия, связанные с выполнением операций вставки и удаления, однако здесь они опущены. 3. Если запрашиваемая со стороны транзакции В блокировка отвергается из-за конфликта с блокировкой, уже установленной со стороны транзакции А, то транзакция В переводится в состояние ожидания. Причем транзакция В будет находиться в состоянии ожидания до тех пор, пока не будет снята блокировка, установленная ранее транзакцией А. Замечание. Система обязательно должна гарантировать, что транзакция В не будет находиться в состоянии ожидания бесконечно долго (иногда эту ситуацию называют зависанием). Самым простым способом получения подобной гарантии является организация обработки запросов на блокировку по принципу первым поступил - первым обработан . 4. Х-блокировки сохраняются вплоть до конца выполнения установившей их транзакции (до ее фиксации (COMMIT) или отката (ROLLBACK)). S-блокировки также обычно сохраняются вплоть до окончания транзакции, однако в этом случае следует учесть замечания, изложенные в разделе 15.7. Описываемый здесь протокол является примером протокола двухфазной блокировки (более подробно он рассматривается в разделе 15 6)
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |