|
Программирование >> Хронологические базы данных
Понятие упорядочиваемости существенно облегчает понимание этой довольно запутанной области знаний. В дополнение к уже сказанному следует добавить еще несколько комментариев. Пусть I является чередующимся фафиком, включающим некоторый набор транзакций Т1, 12, In. Если I является упорядоченным фафиком, то существует некоторый последовательный фафик S, включающий тот же набор транзакций Tl, Т2,..., Тп, такой, что фафик I будет эквивалентен фафику S. В этом случае фафик S называется упорядочением фафика Е. Как уже было показано ранее, фафик S необязательно является уникальным, т.е. некоторый чередующийся фафик I может иметь несколько упорядочений. Пусть Ti и Т j - некоторые транзакции из множества транзакций Tl, Т2, ..., Тп. Не теряя общности рассуждений, предположим, что в упорядочении S транзакция Ti предшествует транзакции Tj. Следовательно, чередующийся фафик запуска I должен иметь такой эффект, как если бы транзакция Ti выполнялась перед транзакцией Tj. Иначе говоря, неформальная, но очень полезная характеристика упорядочиваемости может быть выражена следующим образом. Если А и В являются двумя произвольными транзакциями некоторого упорядоченного фафика запуска, то либо транзакция А логически предшествует транзакции В, либо транзакция В логически предшествует транзакции А. Иначе говоря, либо транзакция В имеет доступ к результатам выполнения транзакции А, либо транзакция А имеет доступ к результатам выполнения транзакции В. (Если в транзакции А выполняется обновление кортежей р, q, ..., г и транзакция В использует эти кортежи в качестве входных данных, то либо все доступные ей кортежи будут обновлены транзакцией А, либо все доступные ей кортежи будут находиться в том состоянии, в котором они были до выполнения транзакции А, т.е. транзакция В никогда не сможет иметь доступ к смеси кортежей в разных состояниях.) И наоборот, если результат выполнения транзакций не соответствует тем результатам, которые были бы получены при последовательном выполнении транзакции А, а затем транзакции В, либо при последовательном вьшолнении транзакции В, а затем транзакции А, то данный фафик является неупорядоченным и, следовательно, неверным. В заключение стоит подчеркнуть, что если вьшолнение некоторой транзакции А не является двухфазным (т.е. не удовлетворяет требованиям протокола двухфазной блокировки), то всегда можно посфоить другую фанзакцию В, которая при чередующемся выполнении с фанзакцией А приведет к фафику запуска, который не будет упорядоченным, и потому будет неверным. В настоящее время для снижения требований к используемым ресурсам и, следовательно, повышения производительности и пропускной способности системы в реальных СУБД обычно допускается применение не двухфазных транзакций, а фанзакций с ранним снятием блокировки (выполняемым до фиксации фанзакций) с последующей установкой дополнительных блокировок. Однако необходимо понимать, что использование таких фанзакций сопряжено с большим риском. Действительно, при выполнении фанзакций А по протоколу, отличному от двухфазного, предполагается, что в системе в текущий момент не существует никакой другой чередующейся с ней фанзакций В, обращающейся к тем же самым данным (в противном случае в системе возможно получение ошибочных результатов). 15.7. Уровни ИЗОЛЯЦИИ Грубо говоря, термин уровень изоляции используется для описания степени вмешательства параллельно выполняющихся транзакций в работу некоторой заданной фанзакций. Однако для гарантированной упорядоченности используемых графиков за- пуска нельзя допускать никакого постороннего вмешательства! Иначе говоря, уровень изоляции должен быть максимальным. Тем не менее, как уже отмечалось в конце предыдущего раздела, в реальных системах по различным причинам обычно допускаются транзакции, которые работают на уровне изоляции ниже максимального. Замечание. Уровень изоляции обычно рассматривается как некоторое свойство транзакции. В действительности нет никаких причин, по которым транзакция в одно и то же время не могла бы работать с различными уровнями изоляции для разных частей базы данных. Однако из соображений простоты здесь уровень изоляции будет рассматриваться всего лишь как некоторое свойство транзакции. Теоретически можно определить по крайней мере пять уровней изоляции. Однако в [15.9], а также в стандарте языка SQL их всего четыре, тогда как СУБД DB2 фирмы IBM поддерживает только два уровня. Вообше говоря, чем выше уровень изоляции, тем меньше степень возможного взаимного влияния транзакций (и ниже уровень параллельности), и чем ниже уровень изоляции, тем больше степень возможного взаимного влияния транзакций (и выше уровень параллельности работ в системе). В качестве примера рассмотрим два уровня изоляции, поддерживаемых СУБД DB2. Они называются уровнями стабильности курсора и повторяемости считывания. Уровень повторяемости считывания (ПС) является максимальным уровнем изоляции; причем если все транзакции выполняются на этом уровне, то фафики запуска являются упорядоченными (выше в настояшей главе по умолчанию полагалось, что все транзакции выполняются именно на этом уровне изоляции). Уровень стабильности курсора (СК) для транзакции Tl характеризуется следующими особенностями: транзакция адресуется некоторому кортежу t; это действие сопровождается установкой блокировки для кортежа t; адресуемость кортежу t отменяется без его обновления; в результате уровень Х-блокировки не достигается; подобная блокировка может быть снята без необходимости ожидания окончания выполнения транзакции. Обратите внимание, что в этом случае другая транзакция Т2 уже сможет выполнить обновление кортежа t и зафиксировать изменения. Если транзакция Т1 вновь обратится к кортежу t, эти изменения окажутся ей доступны, что в конечном счете может вызвать перевод базы данных в противоречивое состояние. В противоположность этому при использовании уровня изоляции ПС все блокировки кортежей (а не только Х-блокировки) должны сохраняться до окончания выполнения транзакции, поэтому упомянутой выше проблемы не возникает. Здесь следует сделать важные дополнения. 1. Описанная проблема - не единственная из числа проблем, которые могут возникнуть на уровне изоляции СК; просто ее легче всего объяснить. Однако она, к сожалению, позволяет сделать вывод, что уровень изоляции ПС необходим только в тех сравнительно Эта операция выполняется посредством установки курсора в положение, соответствующее требуемому кортежу (подробнее об этом речь шла в главе 4); отсюда и название уровня изоляции: уровень стабильности курсора . Следует уточнить, что в СУБД DB2 блокировка Т1, установленная для кортежа t, является блокировкой для обновления (U-блокировкой), а не разделяемой блокировкой (S-блокировкой) [4.20]. маловероятных случаях, когда данная транзакция дважды обращается к одному и тому же кортежу. Тем не менее существуют весомые аргументы в защиту повсеместного использования уровня изоляции ПС вместо уровня СК. Дело в том, что выполнение транзакции на уровне СК не является двухфазным, а потому (как разъяснялось в предыдущем разделе) упорядоченность используемых в этом случае фафиков не гарантируется. В качестве контраргумента следует указать тот факт, что на уровне изоляции СК в работе системы достигается более высокий уровень параллельности в сравнении с уровнем изоляции ПС (такая ситуация возможна, но вовсе не обязательна). 2. Реализация, поддерживающая любой иной уровень изоляции, кроме максимального, обычно включает те или иные средства явного управления уровнем параллельности. Обычно для этого используется явное указание операторов блокировки LOCK, что позволяет разработчикам создавать свои приложения таким образом, чтобы гарантировать необходимую безопасность и при отсутствии гарантий со стороны самой системы. Например, в СУБД DB2 для этого предусмотрен оператор LOCK TABLE, который позволяет в приложениях с уровнем изоляции СК выполнить явную установку эксклюзивной блокировки данных, помимо тех блокировок, которые система DB2 автоматически устанавливает для принудительного достижения этого уровня. (Обратите внимание, что в стандарте SQL нет никаких механизмов явного управления параллельностью; см. раздел 15.9.) В заключение следует отметить, что предшествующая характеристика уровня повторяемости считывания как уровня максимальной изоляции относится только к реализации уровня ПС в СУБД DB2. К сожалению, в стандарте языка SQL тот же термин, повторяемость считывания , используется для описания уровня изоляции, который находится ниже максимального уровня (см. раздел 15.9). 15.8. Блокировка намерения До сих пор в этой главе предполагалось, что блокировке подвергается отдельный кортеж. Однако, в принципе, не существует никаких ограничений на блокировку больших или меньших единиц данных, например всей переменной-отношения, всей базы данных или (пример противоположного характера) отдельного атрибута внутри заданного кортежа. Уровень блокируемых объектов определяется степенью детализации блокировки [15.9], [15.10]. Как обычно, здесь наблюдается компромисс между степенью детализации и параллельностью: чем мельче объекты детализации, тем выше уровень параллельности в системе; чем крупнее объекты детализации, тем меньше блокировок можно будет установить, а значит потребуется контролировать. В результате снизятся соответствующие накладные расходы (т.е. потребуется меньше необходимых действий). Например, если транзакция устанавливает Х-блокировку для всей переменной-отношения в целом, нет необходимости устанавливать Х-блокировки для отдельных кортежей этой переменной-отношения, что в результате приводит к уменьшению общего количества установленных блокировок. С другой стороны, никакая другая параллельно выполняющаяся транзакция не сможет установить никаких других блокировок для этой переменной-отношения или ее кортежей. Предположим, что транзакция Т устанавливает Х-блокировку для некоторой переменной-отношения R. Получив от транзакции Т подобный запрос, система должна быть способна проверить наличие блокировок, установленных ранее другими транзакциями
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |