Введение в системы БД (542480), страница 138
Текст из файла (страница 138)
Более подробно эти вопросы обсуждаются в (14П2). Заие«ание, Читателя может удивить тот факт, что обновление можно отменить. Дело в том, что система поддерживает файл или журнал регистрации на ленте либо чаще всего на диске, где записываются детальные сведения обо всех выполненных операциях обновления и, в частности, новое и старое значения людифицированного объекта.
Таким образом, при необходимости отмены некоторого обновления система может использовать соответствующий журнал регистрации для возвращения объекта в первоначальное состояние. (На самом деле это слишком упрощенное объяснение. На практике журнал регистрации состоит из двух частей; активной (или оперативной) и архивной (или автономной). Оперативная часть используется во время нормальной работы системы для записи подробных сведений об осуществляемых обновлениях и обычно размещается на лиске. После того как файл оперативной части заполняется, его содержимое перемещается в автономную часть, которая обычно размещается иа магнитной ленте, поскольку эта часть всегда обрабатывается последовательно.) Еше один важный момент. Система должна гарантировать, что индивидуальные операторы сами по себе атомарны (т.е.
выполняются полностью или не выполняются совсем). Это особенно важно для реляционных систем, в которых операторы многоуровневые и обычно оперируют множеством кортежей одновременно. Выполнение таких операторов ни в коем случае не должно прерываться до завершения операции, в результате чего система может остаться в противоречивом состоянии (например, если обновлена только часть требуемых кортежей).
Другими словами. если произошла ошибка во время выполнения подобного оператора, база данных должна остаться полностью неизмененной. Более того, как объясняется в главах 8 и 9, это должно быть справедливо даже в том случае, когда действия оператора являются причиной выполнения дополнительных фоновых операций, например каскадного удаления внешних ключей. 14.3. Восстановление транзакции Транзакция начинается в результате успешного выполнения оператора ВЕ61М ТВАЫВАСТ1ОМ и заканчивается успешным выполнением оператора СОММ1Т или ВОЬЬВАСК. Оператор СОММ1Т устанавливает так называемую точку фиксации (которая в коммерческих продуктах иначе называется точкой синхронизации (зупсрошз)).
Точка фиксации соответствует концу логической единицы работы и, следовательно, точке, в которой база данных находится (или будет находиться) в состоянии непротиворечивости. 547 Глава )4. Восстановление В противовес этому после выполнения оператора КОЬЬВАСК база данных вновь возвращается в состояние, в котором она была в момент начала обработки оператора ВЕ61М ТКАМЯАСТТОМ, т.е. в предыдущую точку фиксации. (Понятие "предыдущая точка фиксации" достаточно корректно даже в случае первой транзакции в программе при условии, что первый оператор ВЕ61М ТКАМВАСТ1ОМ по умолчанию устанавливает в программе первичную точку фиксации.) Замечание, В этом разделе термин "база данных" фактически означает доступную для транзакции часть базы данных.
Другие транзакции могут выполняться параллельно с данной транзакцией и вносить изменения в собственные части базы данных. Таким образом, "вся база данных" может н не быть в полностью непротиворечивом состоянии в момент фиксации конкретной транзакции. Однако, как объясняется в разделе 14.1, в данной главе игнорируется возможность параллельного выполнения транзакций (поскольку такое упрощение существенно не влияет на рассматриваемый вопрос).
Ниже перечислены случаи установки точки фиксации. 1. Все обновления, совершенные программой с момента установки предыдущей точки фиксации, выполнены, т.е. получили статус постоянных. До достижения точки фиксации все выполненные транзакцией обновления могут расцениваться только как пробные в том смысле, что они могут быть отменены (т.е. существует возможность их отката).
Олнако гарантируется, что с момента фиксации обновление уже никогда не будет отменено (это и есть определение понятия "зафиксировано"). 2. Утрачена вся информация о позиционировании базы данных и сняты все блокировки кортежей. Позиционирование базы данных в этом контексте означает, что в любой заданный момент выполняющаяся программа обычно алресуется к конкретному кортежу (например, посредством определенных курсоров в случае языка БОЬ, как показано в главе 4). Эта адресуемость в точке фиксации теряется.
Понятие "блокировка кортежей" рассматривается в следующей главе. Замечание. В некоторых системах имеется опция, с помощью которой программа может сохранять адресуемость к некоторым кортежам (и, следовательно, сохранять некоторые кортежи заблокированными) от одной транзакции к другой. Более подробно речь об этом пойлет ниже, в разделе 14.7. Здесь п. 2 (исключая замечание о возможности сохранения некоторой адресуемости и, следовательно, соответствующей блокировки кортежей) также применим, когда транзакция завершена оператором КОЬЬВАСК, а не СОММ1Т.
К п. 1 это, конечно, не относится. Обратите особое внимание на то, что операторы СОММ1Т и КОЬЬВАСК завершают транзакцию, а не программу. В общем случае выполнение одной программы включает выполнение некоторой последовагпельноснги транзакций, запускаемых олна за другой, как показано на рис. 14.2. А сейчас вернемся к примеру из предыдущего раздела (см. рис. 14.1). В нем используется явный тест для определения ошибок, и при обнаружении любой из них оператор КОЬЬВАСК выполняется явным образом. Однако не вызывает сомнения то, что работа системы не может быть построена на предположении, что в программах всегда булут использоваться явные тесты лля выявления всех возможных типов ошибок. Следовательно, система будет выполнять оператор КОЬЬВАСК неявно лля любой программы, которая по какой-либо причине не была нормально завершена (на рис.
14.1 "нормальное завершение" означает явное выполнение оператора СОММ1Т или КОЬЬВАСК). Часть 1(л. управление транзакциями Рис. !4.2. Выполнение типичной програмиы представляет собой последовательность из нескольких транзакций Из всего сказанного выше следует, что транзакции — это не только логические единицы работы, но и единицы восстановления.
При успешном завершении транзакции система гарантирует, что выполненные ею обновления будут существовать в базе данных постоянно, даже если система потерпит крах в следующий момент. Вполне возможно, что в системе произойдет сбой после успешного выполнения оператора ООММ1Т, но перед тем, как обновления будут физически записаны в базу данных (они все еше могут оставаться в буфере оперативной памяти и, таким образом, могут быть утеряны в момент сбоя системы). Даже если подобное случится, процедура перезагрузки системы все равно должна повторно вносить эти обновления в базу данных на основе анализа соответствующих записей в журнале регистрации. (Из этого следует, что журнал регистрации должен быть физически записан перед завершением операции ООММ1Т, Это важное правило называется протоколом предварительной записи в журнал (ччг!зе-а!зеаб !оя гц!е).) Процедура перезагрузкн позволяет восстановить любые успешно завершенные транзакции, обновления которых не были физически записаны во вторичную память до возникновения сбоя системы.
Следовательно, как и указывалось ранее, транзакция действительно является единицей восстановления. Замечание. В следующей главе будет показано, что транзакции также являются елиницами паратлечьности. Более того, поскольку они предназначены для перевода базы данных из одного непротиворечивого состояния в другое непротиворечивое состояние, транзакции являются и единицами целостности (см. главу 8). АСЮ-свойства транзакций Как и в (!4.14], можно подытожить материал этого н предыдущего разделов, сделав заключение, что транзакции обладают четырьмя важными свойствами: атомарностью (а!оппсйу), согласованностью (сопя!з!епсу), изолированностью (Ьо!агюп) н долговечностью (дцгаЬМ!гу), Этот набор свойств принято называть АС!0-свойствами (по первым буквам нх английских названий).
т Атомарность. Транзакции атомарны (выполняется все или ничего). т Согласованность. Транзакции сохраняют базу данных в согласованном состоянии. Это означает, что они переводят базу данных из одного непротиворечивого состояния в лругое, но без обязательной поддержки ее непротиворечивости во всех промежуточных точках выполнения. Глава 14. Восстановление 549 т Изолированность. Транзакции изолированы одна от другой. Это означает, что, даже если будет запущено множество транзакций, работающих параллельно, результаты любых операций обновления, выполняемых отдельной транзакцией, будут скрыты от всех остальных транзакций до тех пор, пока эта транзакция не будет зафиксирована.