Скачиваний:
82
Добавлен:
02.05.2014
Размер:
2.28 Mб
Скачать

14.3. Восстановление транзакции

Транзакция начинается в результате успешного выполнения оператора BEGIN TRANSACTION и заканчивается успешным выполнением оператора COMMIT или ROLLBACK. Оператор COMMIT устанавливает так называемую точку фиксации (которая в коммер- ческих продуктах иначе называется точкой синхронизации (syncpoint)). Точка фик- сации соответствует концу логической единицы работы и, следовательно, точке, в ко- торой база данных находится (или будет находиться) в состоянии непротиворечивости.

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

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

Ниже перечислены случаи установки точки фиксации.

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

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

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

Здесь п. 2 (исключая замечание о возможности сохранения некоторой адресуемости и, следовательно, соответствующей блокировки кортежей) также применим, когда тран- закция завершена оператором ROLLBACK, а не COMMIT. К п. 1 это, конечно, не относится.

Обратите особое внимание на то, что операторы COMMIT и ROLLBACK завершают тран- закцию, а не программу. В общем случае выполнение одной программы включает вы- полнение некоторой последовательности транзакций, запускаемых одна за другой, как показано на рис, 14.2.

А сейчас вернемся к примеру из предыдущего раздела (см. рис. 14.1). В нем исполь- зуется явный тест для определения ошибок, и при обнаружении любой из них оператор ROLLBACK выполняется явным образом. Однако не вызывает сомнения то, что работа сис- темы не может быть построена на предположении, что в программах всегда будут ис- пользоваться явные тесты для выявления всех возможных типов ошибок. Следовательно, система будет выполнять оператор ROLLBACK неявно для любой программы, которая по какой-либо причине не была нормально завершена (на рис. 14.1 "нормальное завершение" означает явное выполнение оператора COMMIT или ROLLBACK).

Транзакция 1

Начало программы

begin

transaction

commit

Транзакция 2 (отменена)

begin

transaction

rollback

Транзакция 3

1

begin

transaction

commit

Завершение программы

Рис. 14.2. Выполнение типичной программы представляет собой последова- тельность из нескольких транзакций

Из всего сказанного выше следует, что транзакции — это не только логические едини- цы работы, но и единицы восстановления. При успешном завершении транзакции система гарантирует, что выполненные ею обновления будут существовать в базе данных постоян- но, даже если система потерпит крах в следующий момент. Вполне возможно, что в систе- ме произойдет сбой после успешного выполнения оператора COMMIT, но перед тем, как об- новления будут физически записаны в базу данных (они все еще могут оставаться в буфере оперативной памяти и, таким образом, могут быть утеряны в момент сбоя системы). Даже если подобное случится, процедура перезагрузки системы все равно должна повторно вно- сить эти обновления в базу данных на основе анализа соответствующих записей в журнале регистрации. (Из этого следует, что журнал регистрации должен быть физически записан перед завершением операции COMMIT. Это важное правило называется протоколом пред- варительной записи в журнал (write-ahead log rule).) Процедура перезагрузки позволяет восстановить любые успешно завершенные транзакции, обновления которых не были фи- зически записаны во вторичную память до возникновения сбоя системы. Следовательно, как и указывалось ранее, транзакция действительно является единицей восстановления.

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

ACID-свойства транзакций

Как и в [14.14], можно подытожить материал этого и предыдущего разделов, сделав заключение, что транзакции обладают четырьмя важными свойствами: атомарностью (atomicity), согласованностью (consistency), изолированностью (isolation) и долговечно- стью (durability). Этот набор свойств принято называть АСШ-свойствами (по первым буквам их английских названий).

  • Атомарность. Транзакции атомарны (выполняется все или ничего).

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

Н Изолированность. Транзакции изолированы одна от другой. Это означает, что, даже если будет запущено множество транзакций, работающих параллельно, ре- зультаты любых операций обновления, выполняемых отдельной транзакцией, будут скрыты от всех остальных транзакций до тех пор, пока эта транзакция не будет зафиксирована. Иначе говоря, для любых отдельных транзакций Т1 и Т2 справедливо следующее утверждение: Т1 сможет увидеть результаты выполнен- ных транзакцией Т2 обновлений только после завершения выполнения транзак- ции Т2, а транзакция Т2 сможет увидеть результаты выполненных транзакцией Т1 обновлений только после завершения выполнения транзакции Т1. Более под- робно эта тема рассматривается в главе 15.

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

Соседние файлы в папке Дейт К. Дж. Введение в системы баз данных [7 издание]