Введение в системы БД (542480), страница 145
Текст из файла (страница 145)
Прн строгом описании протокола имеют место небольшие отличия, связанные с выполнением операций вставки и удаления, однако здесь они опущены. 3. Если запрашиваемая со стороны транзакции В блокировка отвергается из-за конфликта с блокировкой, уже установленной со стороны транзакции А, то транзакция В переводится в состояние ожилания. Причем транзакция В будет находиться в состоянии ожидания до тех пор, пока не будет снята блокировка, установленная ранее транзакцией А. Замечание.
Система обязательно должна гарантировать, что транзакция В не будет находиться в состоянии ожидания бесконечно долго (иногда эту ситуацию называют зависанием). Самым простым способом получения подобной гарантии является организация обработки запросов на блокировку по принципу "первым поступил — первым обработан". 4.
Х-блокировки сохраняются вплоть до конца выполнения установившей их транзакции (до ее фиксации (ООИИ1Т) или отката (ВОЬЬВАОК)). В-блокировки также обычно сохраняются вплоть до окончания транзакции, однако в этом случае следует учесть замечания, изложенные в разделе !5.7. 571 Глава з 5. Параллельность 1 Описыкаемый здесь протокол ллллктсл примером протокола даухзразндй блокировки (более подробно дн рассматриваетсл к разделе 15 б) 15.4.
Устранение трех проблем параллельности Теперь можно вновь вернуться к рассмотрению трех проблем параллельности, описанных в разделе 15.2, и проанализировать, как они решаются с помощью механизма блокировок, предложенного в предыдущем разделе. Проблема потери результатов обновления На рис. 15.б приведена новая версия процесса, представленного на рис. 15.1, которая изменена в соответствии с требованиями протокола блокировки, описанного в разделе 15.3.
Операция обновления дпя транзакции А в момент 83 не будет выполнена, поскольку она является неявным запросом на установку Х-блокировки дпя кортежа ~, Однако этот запрос вступает в конфликт с Я-блокировкой, уже установленной дпя данного кортежа транзакцией В. В результате транзакция А будет переведена в состояние ожидания. По аналогичным причинам транзакция В будет переведена в состояние ожидания в момент 84. Хотя в этом случае результаты обоих обновлений утрачены не будут, решение данной проблемы с помощью механизма блокировки окажется возможным только при решении другой, вновь возникшей проблемы.
Эта новая проблема называется взаимной блокировкой и обсуждается в разделе 15.5. Время Транзакция В Транзакция й Извлечение кортежа б (установка Б-блокировки для с) Рис. 15.б, Хогпя обновпения не утрачиваются, в момент С4 возникает взаиинан блокировка Проблема зависимости от незафиксированных результатов На рис. 15.7 и 15.8 приведены измененные версии примеров, представленных на рис. 15.2 и 15.3 соответственно. Они демонстрируют чередование выполнения операций транзакций согласно описанному выше протоколу блокировки. Операция транзакции А в момент 82 (извлечение на рис. 15.7 и обновление на рис.
15.8) выполнена не будет. Суть в том, что она сопровождаешься выдачей неявного запроса на блокировку кортежа с и этот запрос вступает в конфликт с Х-блокировкой, уже установленной для данного кортежа транзакцией В. В результате транзакция й будет переведена в состояние ожидания, продолжающееся до тех пор, пока выполнение транзакции В не будет закончено (до фиксации или отката транзакции В). При этом установленная транзакцией В блокировка будет 572 Часть 1К Управление транзакз(иязии Обновление кортежа С (запрос Х-блокировки для кортежа б) Ожидание Ожидание Ожидание Ожидание Ожидание с1 82 Извлечение кортежа б (установка Я-блокировки для б) с3 84 Обновление кортежа б (запрос Х-блокировки для кортежа С) Ожидание Ожидание снята и транзакция й сможет продолжить свое выполнение.
Причем теперь транзакция А будет иметь дело уже с некоторым зафиксированным значением (либо существовавшим до начала выполнения транзакции В в случае ее отката, либо полученным после выполнения транзакции В). В любом случае транзакция А больше не зависит от незафиксированных результатов выполнения параллельной транзакции. Время Транзакция В Транзакция А Обновление кортежа С (установка Х-блокировки для С) Окончание или отмена выполнения (отмена Х-блокировки для С) Рис. 15.7. Транзакция А не может получить доступ к незафиксированным результатом изменения картежа г в момент 12 Время Транзакция В Транзакция А Обновление кортежа С (установка Х-блокировки для С) Окончание или отмена выполнения (отмена Х-блокировки для С) Рис, 15.8.
Транзакция А не молсвт обновить незафиксированный результат изменения кортежа С в ма.ивнт С2 Проблема несогласованной обработки данных На рнс. 15.9 приведена измененная версия примера, представленного на рис. 15,4. В новой версии чередование операций транзакций осуществляется в соответствии с протоколом блокировки, описанным в разделе 15.3. Операция обновления транзакции В в момент Сб выполнена не будет. Причина в том, что она предусматривает неявный запрос на установку Х- блокировки для кортежа АСС 1, который вступает в конфликт с Я-блокировкой этого кортежа, уже усгановленной транзакцией А.
В результате транзакция В переводится в состояние ожида- 573 Глава 15. Параллельность Извлечение кортежа С (установка Я-блокировки для С) Ожидание Ожидание Ожидание Итог: извлечение кортежа С (установка Я-блокировки для С) Обновление кортежа С (установка Х-блокировки для С) Ожидание Ожидание Ожидание Итог: обновление кортежа С (установка Х-блокировки для С) С1 С2 СЗ С4 С1 С2 С3 С4 АСС 1 40 АСС 2 50 АСС 3 30 Время Транзакция А Транзакция В 01 02 03 14 05 бб 07 Извлечение кортежа АСС 1: (установка Б-блокировки для кортежа АСС 1) ешз = 40 Извлечение кортежа АСС 2: (установка Я-блокировки для кортежа АСС 2) аци = 90 Извлечение кортежа АСС 3: (установка Я-блокировки для кортежа АСС 3) Обновление кортежа АСС 3: (установка Х-блокировки для кортежа АСС 3) 30 -+ 20 Извлечение кортежа АСС 1; (установка Я-блокировки для кортежа АСС 1) Обновление кортежа АСС 1: (установка Х-блокировки для кортежа АСС 1) Ожидание Ожидание Ожидание Ожидание Ожидание Ожидание Извлечение кортежа АСС 3: (установка Б-блокировки для кортежа АСС 3) Ожидание Ожидание Рис.
75.9. Проблема несогласованной обработки данных устраняетсл, но в гломент с7 возникает другая проблема — взаимная блокировка 574 Часть 1К Управление транзакг(иягии ния. Аналогично этому операция выборки транзакции А в момент 07 также выполнена не будет.
Суть в том, что она сопровождается выдачей неявного запроса на установку Я- блокировки для кортежа АСС 3, а этот запрос вступает в конфликт с Х-блокировкой, уже установленной для данного кортежа транзакцией В. В результате транзакция А также переводится в состояние ожидания. Можно сделать вывод, что хотя механизм блокировки и помогает решить исходную проблему (а именно — проблему несогласованной обработки данных), одновременно он приводит к возникновению другой проблемы (а именно — проблемы взаимной блокировки, которая обсуждается в следующем разделе).
15.5. Взаимная блокировка Как было показано выше, механизм блокировки можно использовать для разрешения трех основных проблем, возникающих при параллельной обработке кортежей транзакциями. К сожалению, использование блокировок приводит к возникновению пру~ой проблемы — взаимной блокировке транзакций. Выше были приведены два примера по- лобных ситуаций.
На рис. 15.10 показана обобщенная схема возникновения данной проблемы, на которой г1 и г2 представляют любые блокируемые объекты, необязательно являющиеся кортежами базы данных (подробности приводятся в разделе 15.8), а выражения типа "блокировка... без совместного доступа" обозначают любые операции установки блокировки (без совместного доступа), заданные как явно, так и неявно. Время Транзакция В Транзакция й с1 с2 г3 с4 Блокировка г1 без совместного доступа Блокировка г2 без совместного доступа Блокировка г2 без совместного доступа Ожидание Ожидание Ожидание Ожидание Ожидание Блокировка г1 без совместного доступа Ожидание Ожидание Рис. ! 5.! О.
Скача возникновения взаич ной блокировки ЗИнагда в литературе ситуация взаимной блокировки упоминается под названиелг "тупиковая ситуация", 575 Глава 15. Параллельность Взаимная блокировка имеет место в том случае, когда две или более транзакций одновременно находятся в состоянии ожидания, причем для продолжения работы каждая из них ожидает прекращения выполнения другой транзакцииз. На рис. 15.10 показана взаимная блокировка для двух транзакций, однако, в принципе, возможны ситуации взаимной блокировки с участием трех, четырех и более транзакций. Тем не менее проведенные с системой Яуз!ещ к эксперименты показали, что на практике ситуации взаимнрй блокировки с участием более двух транзакций почти никогда не встречаются 115.4).
Желательно, чтобы при возникновении взаимной блокировки система могла обнаружить ее и найти из нее выход. Для обнаружения ситуации взаимной блокировки следует организовать поиск замкнутых петель в графе ожидания (т.е. в графе, представля1ошем транзакции, которые ожидают окончания выполнения других транзакций: см. упр. 15.4). Устранение взаимной блокировки заключается в выборе одной из участвующих ~в ней транзакций (т.е. той, которая входит в состав петли на графе ожидания) в качестве жертвы и ее откате. В результате будут сняты все установленные ею блокировки и выполнение других транзакций можно будет продолжить. Замечание.
На практике не все существующие системы контролируют появление именно ситуаций взаимных блокировок. Например, в некоторых из них организуется простой хронометраж выполнения транзакций и решение о возникновении ситуации взаимной блокировки принимается в каждом случае, когда транзакция не завершает свою работу в пределах некоторого заранее предписанного ей интервала времени.