Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Базы данных, знаний и экспертные системы Калабухов ЕВ, БГУИР 2007 (Мет пособие)

.pdf
Скачиваний:
43
Добавлен:
15.06.2014
Размер:
1.77 Mб
Скачать

блокировок, т.к. вторая транзакция не может вставить новые строки, удовлетворяющие уже заблокированному условию. Заметим, что блокировка всей таблицы в каком-либо режиме фактически есть предикатная блокировка, т.к. каждая таблица имеет предикат, определяющий какие строки содержатся в таблице и блокировка таблицы есть блокировка предиката этой таблицы.

6.2.2.2. Метод временных отметок

Другой пессимистический метод сериализации транзакций, хорошо работающий в условиях редких конфликтов транзакций и не требующий построения графа ожидания транзакций, основан на использовании временных отметок.

Основная идея метода состоит в следующем: если транзакция A началась раньше транзакции B, то система обеспечивает такой режим выполнения, как если бы A была целиком выполнена до начала B. Для этого, каждой транзакции T предписывается уникальная временная метка t, соответствующая времени начала T. При выполнении операции над объектом r БД на этот объект ставится временная отметка транзакции T и тип операции (чтение или изменение).

Перед выполнением операции транзакции B над объектом r, СУБД выполняет следующие действия:

1)Проверяет, не закончилась ли транзакция A, пометившая этот объект. Если A закончилась, то объект r помечается временной меткой транзакции B и транзакция B выполняет над объектом необходимую операцию.

2)Если транзакция A не завершилась, то проверяется конфликтность операций над данными. Если операции неконфликтны, при объекте r остается или проставляется временная метка с меньшим значением (более ранняя), и транзакция B выполняет свою операцию.

3)Если операции B и A конфликтуют, то если t(A) > t(B) (т.е. транзакция A является более "молодой", чем B), то транзакция A откатывается и, получив

171

новую временную метку, начинается заново. Транзакция B продолжает работу. 4) Если же t(A) < t(B) (A "старше" B), то транзакция B откатывается и, получив новую временную метку, начинается заново. Транзакция A

продолжает работу.

В результате, меток временных отметок обеспечивает такую работу, при которой при возникновении конфликтов всегда откатывается более молодая транзакция (начавшаяся позже).

Недостатки метода временных отметок:

может откатиться более дорогая транзакция, начавшаяся позже более дешевой;

потенциально более частые откаты транзакций, чем в случае использования метода блокировок, т.к. конфликтность транзакций определяется более грубо.

6.2.3. Оптимистические методы параллельного выполнения транзакций

Использование пессимистичных методов выполнения транзакций гарантирует сериальность планов выполнения смеси транзакций за счет общего замедления работы - конфликтующие транзакции либо ожидают (метод блокировок), либо откатываются (метод временных отметок).

Однако, в некоторых типах вычислительных систем конфликты между транзакциями происходят очень редко (например, мало изменений данных) , поэтому в таких системах пессимистический подход к выполнению транзакций оказывается излишним (перезапуск транзакции в такой системе в случае конфликта более производителен, т.к. случается крайне редко).

Обобщенный оптимистический протокол управления параллельностью состоит из трех фаз:

1) Фаза чтения. Данная фаза начинается от начала транзакции и выполняется до тех пор, пока не потребуется выполнение фиксации

172

результатов транзакции в БД. На этой фазе транзакция считывает значения всех необходимых ей элементов данных и помещает их в локальную область памяти, доступную только данной транзакции. Все изменения данных разрешены транзакции только в этой области.

2) Фаза проверки. Данная фаза следует за фазой чтения. На этой фазе выполняются проверки, необходимые для получения гарантий нарушения целостности БД в случае переноса в нее изменений данных из локальной копии. Для транзакций, включающих только операции чтения, проверка состоит в подтверждении того, что использованные данные не менялись другими транзакциями. Если транзакция обновляла значения данных, то выполняется контроль, имели ли другие транзакции доступ к этим данным. Проверки на этой фазе выполняются с использованием временных отметок Start (начало), Validation (начало проверки) и Finish (завершение выполнения транзакции) и сравниваются с такими же отметками других транзакций по правилам (для подтверждения должно выполняться одно из правил):

все транзакции S с более старыми временными отметками должны быть уже завершены до начала выполнения проверяемой транзакции T (Finish(S) < Start(T));

если транзакция T стартовала до завершения какой-либо из транзакций S, то множество элементов данных, записанных стартовавшей ранее транзакцией, не должно включать ни одного из элементов данных, прочитанных данной транзакцией;

если транзакция T стартовала до завершения какой-либо из транзакций S, то фаза записи стартовавшей ранее транзакции S должна быть завершена до перехода текущей транзакции T в фазу проверки (Start(T) < Finish(S) <

Validation(T)).

При обнаружении ошибок данная транзакция отменяется и перезапускается. Если же ошибок на фазе проверки не обнаружено, то выполняется переход к третьей фазе.

3) Фаза записи. Данная фаза выполняется только после успешно

173

проведенной фазы проверки, но только для тех транзакций, которые выполняли обновление локальных данных. Эти изменения переносятся собственно в БД.

Следует заметить, что откат данных в такой системе не выполняется, т.к. при отмене транзакции ее локальная копия просто уничтожается, также в принципе невозможны каскадные откаты. Однако длинные транзакции в таких системах не приветствуются, по причине большой затраты процессорного времени в случае полного перезапуска транзакции.

Если перезапуск транзакций возникает достаточно часто, то это может указывать на то, что оптимистические технологии мало подходят для управления параллельностью в данной конкретной системе.

6.2.4. Реализация изолированности транзакций средствами SQL

Стандарт SQL не предусматривает понятие блокировок для реализации сериализуемости смеси транзакций. Вместо этого вводится понятие уровней изоляции. Этот подход обеспечивает необходимые требования к изолированности транзакций, оставляя возможность производителям различных СУБД реализовывать эти требования своими способами (в частности, с использованием блокировок или выделением версий данных).

Стандарт SQL предусматривает 4 уровня изоляции:

READ UNCOMMITTED - уровень незавершенного считывания;

READ COMMITTED - уровень завершенного считывания;

REPEATABLE READ - уровень повторяемого считывания;

SERIALIZABLE - уровень способности к упорядочению.

Если все транзакции выполняются на уровне SERIALIZABLE (принятом по умолчанию), то чередующееся выполнение любого множества параллельных транзакций может быть упорядочено. Если некоторые транзакции выполняются на более низких уровнях, то имеется множество способов нарушить способность к упорядочению. В стандарте SQL выделены три особых случая

174

нарушения способности к упорядочению, фактически именно те, которые были описаны выше как проблемы параллелизма:

неаккуратное считывание ("грязное" чтение, зависимость от незафиксированных результатов);

неповторяемое считывание (частный случай несогласованной обработки);

фантомы (фиктивные элементы - частный случай несогласованной обработки).

Потеря результатов обновления стандартом SQL не допускается, т.е. на самом низком уровне изолированности транзакции должны работать так, чтобы не допустить потери результатов обновления.

Различные уровни изоляции определяются по возможности или исключению этих особых случаев нарушения способности к упорядочению. Эти определения описываются следующим образом:

Уровень изоляции

Неаккуратное

Неповторяемое

Фантомы

 

считывание

считывание

 

 

 

 

 

READ UNCOMMITTED

Да

Да

Да

 

 

 

 

READ COMMITTED

Нет

Да

Да

 

 

 

 

REPEATABLE READ

Нет

Нет

Да

 

 

 

 

SERIALIZABLE

Нет

Нет

Нет

 

 

 

 

Уровень изоляции транзакции задается следующим оператором:

SET TRANSACTION {ISOLATION LEVEL {READ UNCOMMITTED

| READ COMMITTED

| REPEATABLE READ | SERIALIZABLE}

| {READ ONLY | READ WRITE}}.,..

Этот оператор определяет режим выполнения следующей транзакции, т.е.

175

этот оператор не влияет на изменение режима той транзакции, в которой он подается. Обычно, выполнение оператора SET TRANSACTION выделяется как отдельная транзакция. Если задано предложение ISOLATION LEVEL, то за ним должно следовать один из параметров, определяющих уровень изоляции. Кроме того, можно задать признаки READ ONLY или READ WRITE. Если указан признак READ ONLY, то предполагается, что транзакция будет только читать данные. При попытке записи для такой транзакции будет сгенерирована ошибка. Признак READ ONLY введен для того, чтобы дать производителям СУБД возможность уменьшать количество блокировок путем использования других методов сериализации.

Оператор SET TRANSACTION должен удовлетворять следующим условиям:

если предложение ISOLATION LEVEL отсутствует, то по умолчанию принимается уровень SERIALIZABLE;

если задан признак READ WRITE, то параметр ISOLATION LEVEL не может принимать значение READ UNCOMMITTED;

если параметр ISOLATION LEVEL определен как READ UNCOMMITTED, то транзакция становится по умолчанию READ ONLY, в противном случае по умолчанию транзакция считается как READ WRITE.

6.3.Восстановление данных

Восстановление данных после сбоев системы связано с таким свойством транзакций, как долговечность. Главное требование долговечности данных транзакций состоит в том, что данные зафиксированных транзакций должны сохраняться в системе, даже если в следующий момент произойдет сбой системы.

176

6.3.1. Влияние сбоев и отказов на БД

Работа с данными в СУБД проводится с использованием двух видов памяти:

долговременная память – память, которая может хранить данные при выключении питания системы; данный вид памяти характеризуется большими объемами хранимой информации и достаточно большим временем доступа к данным (плохая производительность по сравнению с производительностью процессора); используется для хранения рабочей версии БД (накопители на жестких дисках) или ее копии (магнитные ленты, оптические диски);

кратковременная память – память, которая хранит данные только при сохранении питания (ОЗУ); такая память характеризуется малым временем доступа к данным, но также и малыми объемами хранения информации; используется для промежуточного хранения данных.

Для поддержки необходимой производительности системы нельзя непосредственно оперировать данными, хранящимися в долговременной памяти системы, т.к. скорость работы с данными снизится и очень критично. Поэтому для работы с данными используется их промежуточная буферизация в оперативной памяти. Это означает, что текущие данные попадают во внешнюю долговременную память не сразу после внесения изменений, а через некоторое (достаточно большое) время.

Буфер памяти в СУБД в общем случае состоит из страниц. Страницы базы данных, содержимое которых в буфере отличается от содержимого на диске, называются "грязными" (dirty) страницами. Система постоянно поддерживает список "грязных" страниц - dirty-список. Запись "грязных" страниц из буфера на диск называется выталкиванием страниц во внешнюю память. Для обеспечения максимальной скорости выполнения транзакций необходимо выталкивать страницы на диск как можно реже. Если бы

177

оперативная память была бы бесконечной, а сбои никогда бы не происходили, то наилучшим выходом была бы загрузка всей БД в оперативную память и работа с данными только в оперативной памяти, а запись измененных страниц на диск только в момент завершения работы всей системы. Однако, на настоящий момент объемы оперативной (энергозависимой) памяти не могут вместить всех обрабатываемых данных, и нет полной защиты от сбоев, поэтому данные должны из буфера памяти время от времени выталкиваться на диск (даже если бы мы обладали бесконечной, но энергозависимой памятью).

Влияние внешних и внутренних факторов на память системы приводит к утрате необходимых данных. Восстановление БД может производиться в следующих характерных случаях:

1)Индивидуальный откат транзакции. Откат индивидуальной транзакции может быть инициирован либо самой транзакцией путем подачи команды ROLLBACK, либо СУБД в случае возникновения какой-либо ошибки в работе транзакции (например, деление на нуль) или если эта транзакция выбрана в качестве жертвы при разрешении тупика. При таких сбоях нет потерь данных в обоих видах памяти системы.

2)Мягкий сбой системы. Мягкий сбой характеризуется утратой оперативной памяти системы. При этом поражаются все выполняющиеся в момент сбоя транзакции, теряется содержимое буферов. Данные, хранящиеся в долговременной памяти, при таких сбоях остаются неповрежденными. Мягкий сбой может произойти, например, в результате аварийного отключения электрического питания, в результате неустранимого сбоя других электронных компонентов системы (например, процессора) или аварийного отказа программного обеспечения (например, сбой операционной системы).

3)Жесткий сбой системы (аварийный отказ аппаратуры). Жесткий сбой характеризуется повреждением долговременной памяти. Жесткий сбой может произойти, например, в результате поломки головок дисковых накопителей. При таком сбое обычно теряется и содержимое буферов оперативной памяти.

178

6.3.2. Средства защиты данных

Для защиты от сбоев и отказов в СУБД предусмотрены специализированные методы и средства защиты данных:

1)Резервное копирование данных. Резервное копирование данных представляет собой дублирование БД на другом долговременном носителе. Выполнение резервного копирования обычно осуществляется в периоды минимальной работы с данными, поэтому обычно выполняется не чаще одного раза в сутки (например, ночью). Резервное копирование может выполняться в следующих вариантах:

полное дублирование БД – требует достаточно больших объемов памяти резервного носителя, но не требует хранения всех предыдущих копий БД;

дублирование только изменений в данных, произошедших с момента предыдущего резервного копирования, характеризуется небольшими объемами хранимых данных за одну сессию резервирования, но зависит от всех предыдущих сессий.

Внастоящее время для резервного копирования обычно используются оптические носители (CD- (DVD-) ROM или RW).

2)Ведение журнала транзакций. Требование атомарности транзакций утверждает, что не законченные или откатившиеся транзакции не должны оставлять следов в БД. Это означает, что данные должны храниться с избыточностью, позволяющей иметь информацию, по которой восстанавливается состояние БД на момент начала неудачной транзакции. Такую избыточность обычно обеспечивает журнал транзакций. Журнал транзакций содержит детали всех операций модификации данных в БД, в частности:

системный номер транзакции;

время начала и окончания транзакции;

старое и новое значение модифицированного транзакцией объекта и вид

179

проводимой операции;

системная статистика (пользователи, системные ошибки, свободное место на диске и т.п.).

Как и страницы БД, данные журнала транзакций не записываются сразу на диск, а предварительно буферизируются в оперативной памяти. Основным принципом работы с буфером журнала является то, что запись об изменении объекта БД должна попадать во внешнюю память журнала раньше, чем измененный объект данных оказывается во внешней памяти БД. Соответствующий протокол журнализации (и управления буферизацией) называется WAL (Write Ahead Log - пиши сначала в журнал). Это означает, что если требуется вытолкнуть во внешнюю память измененный объект БД, то перед этим нужно гарантировать выталкивание во внешнюю память журнала записи о его изменении. Таким образом, если во внешней памяти БД содержится объект, к которому применена некоторая команда модификации, то во внешней памяти журнала транзакций содержится запись об этой операции. Обратное неверно - если во внешней памяти журнала содержится запись о некотором изменении объекта, то во внешней памяти базы данных может и не быть самого измененного объекта. Обычно все изменения вносимые транзакцией в журнал не записываются сразу на диск, т.к. это требует больших временных затрат. Минимальным требованием, гарантирующим возможность восстановления последнего согласованного состояния БД, является выталкивание при фиксации транзакции во внешнюю память журнала всех записей об изменении БД этой транзакцией. При этом последней записью в журнал, производимой от имени данной транзакции, является специальная запись о конце этой транзакции.

3) Своевременная очистка буферов оперативной памяти. Дополнительным условием выталкивания буферов является ограниченность объемов буферов БД и журнала транзакций. Периодически или при наступлении определенного события (например, количество страниц в dirtyсписке превысило определенный порог, или количество свободных страниц в

180