Введение в системы БД (542480), страница 152
Текст из файла (страница 152)
Управление транзакс/иями 15.14.Кип8 Н.Т., КоЬ|пзоп 1.Т. Оп Орйшййс Ме!Ьодз гог Сопсцггепсу Сон!го! й АСМ ТОПЯ. — )цпе, 198 !. — 6, № 2. Схемы блокировки рассматриваются как пессимистические в случае, когда делается предположение (худшее из возможных) о том, что все данные, необходимые для заданной транзакции, могут также потребоваться для параллельно выполняемой транзакции, а поэтому их следует заблокировать. В оптимистических схемах (или схемах сертификации или подтверждения) делается противоположное допущение о том, что такие конфликтные ситуации весьма маловероятны.
Поэтому в рассматриваемых схемах допускается беспрепятственное выполнение всех транзакций. И только во время фиксации проверяется наличие конфликтных ситуаций. Если такие конфликты имели место, то вызвавшие их транзакции перезапускаются. Никакие обновления не записываются в базу данных до успешного завершения процедуры фиксации, поэтому при повторном запуске транзакций не требуется отменять какие-либо операции обновления. Позднее в [15.61 было показано, что при некоторых разумных предположениях оптимистические методы демонстрируют некоторые присущие им преимушества по сравнению с традиционными методами блокировки для некоторого уровня параллельности (т.е, некоторого числа одновременно выполняемых транзакций), который они способны поддерживать.
Предполагается, что оптимистические методы могут быть наиболее полезны в системах с большим количеством параллельных процессоров. (В [14.12), наоборот, утверждается, что оптимистические методы в общем случае на самом деле хуже методов блокировки в некоторых "горячих' ситуациях, т.е.
в ситуациях, когда объект данных обновляется очень часто и несколькими различными транзакциями. Более подробную информацию о методах, эффективных при работе в подобных ситуациях, можно найти в [15.15].) 15.15.0'Хе!! Р.Е. ТЬе Езсгозн Тгапзасйопа! Мегйод 1/ АСМ ТООБ. — ОесешЬег, 1986. — 11, № 4. Рассмотрим следующий весьма простой пример. Предположим, что в базе данных содержится объект данных ТС, представляющий "имеющуюся на руках наличность", и допустим, что почти каждая транзакция в системе обновляет данные в объекте ТС с некоторым уменьшением их значения (соответствующим некоторому текущему платежу). Объект ТС представляет собой пример "горячей точки", т.е. элемента базы данных, который используется большинством транзакций в системе.
Образно говоря, при традиционной блокировке "горячая точка*' может очень скоро превратиться в узкое место всей системы, а потому было бы весьма неразумно использовать традиционную блокировку в таких ситуациях. Если начальное значение ТС равно 10 миллионам долларов, а каждая отдельная транзакция приводит к ее уменьшению в среднем на 10 долларов, то в целом может быть выполнено около миллиона таких транзакций. Причем для этого потребовалось бы выполнить в произвольном порядке акало миллиона операций вычитания. В таком случае действительно вовсе нет необходимости в использовании традиционной блокировки для ТС.
Вместо этого достаточно убедиться, что текущее значение достаточно велико для успешного выполнения данной операции вычитания, а затем выполнить обновление значения. (Если выполнение такой транзакции не будет успешно завершено, то последнюю операцию вычитания следует отменить.) Глава 15. Параллельность 595 Метод депонирования применяется в ситуациях, подобных описанной выше, т.е.
когда обновления имеют некоторую конкретную, а не произвольную форму. В такой системе должен быть определен особый вид оператора обновления (например, "уменьшить на х тогда и только тогда, когда текущее значение больше, чем х"). В этом случае обновление можно было бы выполнить, помещая уменьшенное значение х в некоторый третий объект-депонент, для его извлечения оттуда в кснце выполнения транзакции. Если транзакция фиксируется, извлеченное значение помещается в х, если же выполняется откат транзакции, восстанавливается исходное значение х. В статье описывается несколько ситуаций, в которых можно использовать метод депонирования.
Одним из примеров коммерческого продукта, в котором поддерживается данный метод, является информационная система 1М5 Гаяг Рагй фирмы !ВМ. Следует отметить, что этот метод может рассматриваться как особый случай оптимистического управления параллельностью (15.14) (обратнте внимание, однако, что именно специфичность, т.е. применение специальных операторов обновления, и является важнейшим условием). 15.16.Рарасйппггюц С. ТЬе ТЬеогу ог 1)агаЬазе Сопсштепсу Сопгго1. — йос!сч!!!е, Мг(:. Согпрцгег 5с!епсе Ргезз, 1986. Учебное пособие, в котором особое внимание уделяется формальной теории.
15.17.5а!еш К., Оагс!а-Мо!!па О., ЯЬапг!з 1. АИппзйс 1.оск!п8 д АСМ Т005. — МагсЬ, ! 994. — 19, № 1. В этой статье предлагается расширение протокола двухфазной блокировки, в соответствии с которым транзакция Т1, завершившая работу с заблокированным элементом данных (который не может быть разблокирован из-за ограничений протокола двухфазной блокировки), все же "возвращает'* этот элемент системе, тем самым позволяя некоторой транзакции Т2 установить для него блокировку.
В этом случае говорят, что транзакция Т2 "идет вслед за" транзакцией Т1. Здесь определены протоколы, например сокрытия от транзакции обновлений, которые выполняются следующими за ней транзакциями. Показано, что альтруистическая блокировка (этот термин происходит от того факта, что "возвращение" данных приносит пользу другим транзакциям, а не транзакции- донору) обеспечивает более высокую степень параллельности, чем обычный протокол двухфазной блокировки, особенно когда некоторые из транзакций продолжаются достаточно долго. Ответы к некоторым упражнениям 15.3. а) Существует шесть возможных корректных результатов, соответствующих шести возможным последовательным графикам запуска.
Исходно : А = 0 Т1-Т2-ТЗ : А = 1 Т1-ТЗ-Т2 : А = 2 Т2-Т1-ТЗ ; А = 1 59б Чаепгь 1)г. управление транзакциями А= 2 А=4 А=З Т2-ТЗ-Т1 тЗ-т1-тг ТЗ-Т2-Т1 Конечно, не все шесть полученных результатов отличаются один от другого. Фактически в данном примере так получилось потому, что благодаря природе транзакции ТЗ возможные правильные результаты независимы от начального состояния базы данных.
б) Существует 90 возможных графиков запуска, отличных один от другого, которые можно представить в приведенном ниже символическом виде. (Здесь К1, НЗ, Кх обозначают операции извлечения К1, Н2, КЗ, причем необязательно в той же последовательности. Аналогично Вр, Вп, Вг обозначают операции обновления И, 02, 03, необязательно в той же последовательности.) К1-КЗ-й)г-Вр-Щ-Вг кт-НЗ-бр-Кк-09-бг КТ-КЗ-Вр-Вп-НК-Вг К1-Вр-КЗ-КК-Во-Вг К1-Вр-КЗ-09-КК-бг 2 * 1 = Зб вариантов 2 ' 1 = 24 вариантов 1 " 1 = 12 вариантов 2 * 1 = 12 вариантов 1 * 1 = б вариантов :3*2*1*3" :3*2*2Я1* :3*2*2*1* 3*1*2*1* ".
3'1*2*1' Всего = 90 вариантов 597 Глава 15. Параллельность в) Да. Например, график запуска К1-К2-КЗ-03-02-И приводит к тому же результату (единица) для заданного начального значения (нуль), что и два из шести возможных последовательных графиков запуска. (Упражнение. Проверьте зто утверждение.) Однако следует понимать, что "корректность" полученного результата является всего лишь счастливой случайностью и следствием того, что исходное значение было равно 0, а не какому-то другому числу. В качестве примера обратной ситуации рассмотрите случай, когда исходное значение равно 10. Будет ли показанный выше график запуска давать один из действительно корректных результатов? (Какими в этом случае будут действительно корректные результаты?) Если нет, то график запуска К1-К2-КЗ-03-02-01 не допускает упорядочения.
г) Да. Например, график запуска К1-КЗ-И-03-К2-02 является упорядоченным (он эквивалентен последовательному графику запуска Т1-Т2-ТЗ), но не может быть получен, если выполнение транзакций Т1, Тг и ТЗ подчиняется двухфазному протоколу блокировки. В этом случае для выполнения операции й3 потребуется установить Б-блокировку для элемента А с согласия транзакции ТЗ. Тогда операция И в транзакции Т1 не будет выполняться до тех пор, пока не будет снята блокировка, а это не произойдет до завершения выполнения транзакции ТЗ (действительно, при достижении операции 03 транзакции ТЗ и Т1 попадут в ситуацию взаимной блокировки).
Это упражнение прекрасно иллюстрирует следующий очень важный момент. Пусть для данного набора транзакций и начального состояния базы данных задано множество всех возможных графиков запуска (АББ), содержащих эти транзакции, множество всех графиков запуска (СОНКЕСТ), которые гарантированно приводят к 15.4. 15.5. 15.6. 15.9.
корректному финальному состоянию или, по крайней мере, могут привести к нему для некоторого начального состояния, множество всех допускающих упорядочивание графиков запуска (ВЕК1АЫЕАВЬЕ), а также множество всех графиков запуска (РКОРОС1ВЬЕ), которые приводят к корректному результату при использовании двухфазного протокола блокировки. Тогда в общем случае будет верно слелуюшее утверждение (здесь знак "<" обозначает "подмножество").
РКОРОС1ВЬЕ < ЯЕК1АР13АВЬЕ < СОККЕСТ < АРЬ В момент бл ни одна из транзакций не выполнит никакой полезной работы! Дело в том, что имеет место ситуация взаимной блокировки, включающая транзакции Т2, ТЗ, Т9 и Т8. Кроме того, транзакция Т4 находится в состоянии ожидания (ожидает) завершения выполнения транзакции Т9, транзакция Т12 ожидает завершения вы- полнения транзакции Т4, а транзакции Т10 и Т!1 ожидают завершения выполнения транзакции Т12. Эту ситуацию можно представить с помощью приведенного на рис. 15.14 графа ожидания, узлы которого представляют собой транзакции, а направленные от узла ТТ к узлу Т) ребра указывают на то, что транзакция ТТ находится в состоянии ожидания завершения выполнения транзакции Тз1 Возле стрелок размещены названия объектов базы данных с указанием в скобках уровня блокировки, в котором они находятся в состоянии ожидания.
Для задач, приведенных на рис. 15.1 — 15.3, уровень изоляции стабильности курсора обладает тем же эффектом, что и уровень повторяемости считывания (обратите внимание, однако, что для СУБД (зВ2 это утверждение не применимо к уровню стабильности курсора из-за того, что в этой СУБД вместо Б-блокировок используются 13-блокировки (4.201). Что касается проблемы несогласованной обработки данных (см.
рис. 15.4), то уровень изоляции стабильности курсора не позволяет разрешить эту проблему. Дело в том, что транзакция А должна выполняться на уровне повторяемости считывания для того, чтобы сохранить все свои блокировки до завершения выполнения транзакции, иначе будет получен неверный результат. (Конечно, если система поддерживает такой режим, то в качестве альтернативного варианта можно было бы с помощью транзакции А полностью заблокировать всю переменную-отношение счетов, установив некоторую явно заданную блокировку. Это решение можно было бы использовать как для уровня стабильности курсора, так и для уровня повторяемости чтения,) См, раздел 15.8.