Введение в системы БД (542480), страница 144
Текст из файла (страница 144)
Три проблемы параллельности Прежде всего следует рассмотреть проблемы, которые обязательно должны устраняться любым из предлагаемых методов управления параллельностью. При обработке транзакций в общем случае возможны три типа ситуаций, при которых параллельное выполнение транзакций, каждая из которых сама по себе является корректной, из-за взаимных помех способно привести к неправильному результату. Обратите внимание, что вносящая помеху транзакция сама по себе может быть вполне корректной, а неправильный конечный результат возникает из-за бесконтрольного чередования операций двух правильных транзакций. (Выражение "правильная транзакция" здесь означает, что эта транзакция не нарушает золотое правило, описанное в главе 8.) Ниже приводятся трн проблемы, возникающие при параллельной обработке транзакций.
° Потеря резулыпатов обновления ° Зависимость от незафиксированных резулыпатов ° Несогласованная обработка данных Проблема потери результатов обновления Рассмотрим ситуацию, показанную на рис. 15.1. Здесь транзакция А считывает некоторый кортеж с в момент с1, а транзакция В считывает этот же кортеж 1 в момент 12. Далее транзакция А обновляет кортеж б в момент 13 (исходя из значений, считанных в момент 11), а транзакция В обновляет тот же кортеж с в момент с4 (исходя из значений, считанных в момент с2 и аналогичных значениями, которые были считаны в момент с1). Можно видеть, что результат операции обновления, выполненной транзакцией А, будет утерян, поскольку в момент ь4 он будет перезаписан в результате операции обновления, выполняемой транзакцией В.
Заиечание. Здесь и далее в этой главе вновь делается допущение, что имеет смысл говорить об "обновлении кортежа". Проблема зависимости от незафиксированных результатов Проблема зависимости от незафиксированных результатов может возникнуть в том случае, если любой транзакции разрешено считывание [или, что еше хуже, обновление) кортежа, который только что был обновлен другой транзакцией, но результаты выполне- 567 Глава з 5. Параллельность ния этой транзакции еше не были зафиксированы. Если некоторое обновление не зафиксировано, всегда существует определенная вероятность, что оно не будет зафиксировано никогда из-за отката данной транзакции. В этом случае первая транзакция будет обрабатывать данные, которые уже не существуют (и, в сущности, никогда не сушествовали).
Данная ситуация представлена на рис. 15.2 и 15.3. Рис. 15. !. Потеря в мачент ь4 результатов обновления, выполненного транзакцией А Рис. !5.2. В мочент с2 транзакция А оказывается зависимой от незафиксированных ре- зультатов обновления Рис. !5.3. Транзакция А обновляет незафиксированное изменение в момент 12, но ре- зультаты этого обновления утрачиваются в момент С3 В первом примере (см. рис. 15.2) транзакция А в момент С2 получает доступ к незафиксированным результатач обновления (иногда называемым незафиксированным изменвпивч).
Затем это обновление в момент ь3 отменяется. В результате транзакция А выполняется, исходя из ошибочного предположения, что кортеж с имеет значение, которое он имел в момент т.2, тогда как на самом деле он сохранил свое прежнее значение, которое имел в момент с1. В итоге в результате выполнения транзакции А будет получен не- 568 Часть Лг управление транзакциями верный результат. Кроме того, следует учитывать, что откат транзакции В может произойти не по вине транзакции В, а, например, в результате сбоя системы.
(К этому времени выполнение транзакции А может быть уже завершено, а потому сбой системы не приведет к откату транзакции А.) Второй пример, приведенный на рис. 15.3, иллюстрирует еше более неприятный случай. В момент с2 транзакция А вновь оказывается зависимой от незафиксированного изменения. Более того, в момент В3 все ее результаты фактически утрачиваются, поскольку откат транзакции В приводит к восстановлению исходного состояния кортежа (., которое он имел в момент Г1.
Это еше один вариант проблемы потери результатов обновления. Проблема несогласованной обработки данных На рис. 15гй показаны транзакции А и В, которые обрабатывают кортежи, содержащие сведения об остатках на счетах (АСС). При этом транзакция А суммирует текущие остатки на счетах, а транзакция В выполняет перевод суммы в $10 со счета 3 на счет 1. Полученный в итоге выполнения транзакции А результат $110, очевидно, неверен, и если он будет помещен в базу данных, то она окажется в противоречивом состоянии'.
В таком случае говорят, что транзакция А выполняет несогласованную обработку данных, в результате чего получается противоречивый результат. Обратите внимание на следующее отличие этого примера от предыдущего: здесь не идет речь о зависимости транзакции А от незафиксированных результатов транзакции В, так как последняя выполнила и зафиксировала все свои обновления до того, как транзакция А считала значение остатка для счета АСС 3. 1 5.3. Блокировка Как упоминалось в разделе 15.1, описанные в предыдущем разделе проблемы могут быть разрешены с помощью механизма управления параллельным выполнением процессов, называемого блокировкой.
Основная идея очень проста: в случае, когда прн выполнении некоторой транзакции необходимо иметь гарантии, что определенный объект базы данных (обычно это кортеж) не будет непредсказуемо изменен без ведома данной транзакции (как это имело место выше), требуемый объект блокируется. Эффект выполнения блокировки состоит в том, что доступ к объекту со стороны других транзакций запрещается, а это позволяет предотвратить его неконтролируемое изменение. В результате установившая блокировку транзакция сможет выполнять всю необходимую обработку, имея полную гарантию, что обрабатываемый объект будет оставаться в неизменном состоянии настолько долго, насколько потребуется.
Ниже работа механизма блокировки описана более подробно. !. Прежде всего предположим, что в системе поддерживается два типа блокировок: эксклюзивная блокировка, или Х-блокировка, не допускающая совместного доступа, и разделяемая блокировка, или Б-блокировка, разрешающая совместный доступ. З В отношении этой аозиолсности (т.е.
записи результатов а базу данных) предполагается, что не сущестаует никакич ограничений целостности, запрещающих подобную запас 5б9 Глава 15. Параялельноать АСС 1 40 АСС 2 00 АСС 3 80 Время Транзакция В Транзакция А ! с1 ! ! с2 с3 с4 ! 85 ! Вб 87 88 Извлечение кортежа АСС 1: аци = 40 Извлечение кортежа АСС 2: вци = 90 Извлечение кортежа АСС 3: Обновление кортежа АСС 3: 30 -э 20 Извлечение кортежа АСС 1: Обновление кортежа АСС 1: 40 -э 50 Фиксация результатов транзакции Извлечение кортежа АСС 3: вци = 110 (а не 120) Рис, ! 5, 4 Транзакция А получила противоречивый результат 570 Часть 1К Управление транзакг(ияяги Замечание. Х- и Б-блокировки иногда называют блокировками для записи и чтения соответственно.
Здесь предполагается, что возможны только Х- и В-блокировки, хотя в разделе 15.8 приводятся примеры блокировок лругих типов. Кроме того, предполагается, что единственным типом "блокируемого объекта" являются кортежи, хотя примеры других типов таких объектов описаны, опять же, в разделе 15.8. 2. Если транзакция А заблокировала кортеж с без возможности взаимного доступа (Х- блокировка), то запрос другой транзакции В на блокировку этого же кортежа ь будет отменен.
3. Если транзакция А заблокировала кортеж 8 с возможностью взаимного доступа (8- блокировка), то: ' запрос со стороны некоторой транзакции В на выполнение Х-блокировкн кортежа с будет отвергнут; ' запрос со стороны некоторой транзакции В на выполнение 8-блокировки кортежа 0 будет принят (т.е. для транзакции В также будет установлена $-блокировка кортежа 8). Этп правила можно наглядно представить в виде матрицы совместимости типов блокирован, показанной на рис.
15.5. Эта матрица интерпретируется следуюшим образом. Рассмотрим некоторый кортеж с и предположим, что транзакция А блокирует кортеж 1 различными типами блокировки (что обозначено в заголовках столбцов соответственно символами Я и Х, тогда как отсутствие блокировки — прочерком). Предположим также, что некоторая транзакция В запрашивает блокировку кортежа С, тип которой на рис. 15.5 указан в первом слева столбце матрицы. (Для полноты картины в таблице также приведен случай отсутствия блокировки.) В остальных ячейках матрицы символ )ч отмечает конфликтную ситуацию (запрос со стороны транзакции В не может быть удовлетворен, и эта транзакция переводится в состояние ожидания), а т' — допустимую ситуацию (запрос со стороны транзакции В удовлетворяется). Очевидно, что данная матрица является симметричной.
Я )з! Х з' х' з' У Рис. !5.5. Матрица совместимости для Х- и Б-блакиравак Теперь следует ввести понятие протокол доступа к данным (или протокол блокировки), который с помощью описанных выше Х- и $-блокировок позволит избежать возникновения проблем, обсуждавшихся в разделе 15.2з. 1. Прежде чем считать какой-либо кортеж, транзакция должна установить для него бблокировку. 2. Прежде чем обновить какой-либо кортеж, транзакция должна установить для него Х-блокировку. Если транзакция уже установила для кортежа Б-блокировку (что возможно в случае последовательного выполнения операций ВебгТече и УрдаСе), необходимо расширить 8-блокировку до уровня Х-блокировки. Замечание.
В транзакциях запросы на установку блокировки обычно задаются неявным образом; например, запрос на выборку кортежа подразумевает неявный запрос на установку для него Б-блокировки, а запрос на обновление кортежа — неявный запрос на установку для него Х-блокировкн. При этом под термином "обновление" (как и ранее) подразумеваются, помимо операций ОРЭАТЕ, также операции 1НБЕЕТ (вставка) и ОЕЬЕТЕ (удаление).