- •Глава 13. Семантическое моделирование
- •Часть III Проектирование базы данных
- •Часть IV
- •14.1. Введение
- •14.2. Транзакции
- •14.3. Восстановление транзакции
- •14.4. Восстановление системы
- •14.5. Восстановление носителей
- •14.6. Двухфазная фиксация
- •14.7. Поддержка языка sql
- •14.8. Резюме
- •15.1. Введение
- •15.2. Три проблемы параллельности
- •15.3. Блокировка
- •15.4. Устранение трех проблем параллельности
- •15.5. Взаимная блокировка
- •15.6. Упорядочиваемость
- •15.7. Уровни изоляции
- •15.8. Блокировка намерения
- •15.9. Средства языка sql
- •15.10. Резюме
- •Часть V
- •16.1. Введение
- •16.2. Избирательная схема управления доступом
- •16.3. Мандатная схема управления доступом
- •16.4. Статистические базы данных
- •16.5. Шифрование данных
- •16.6. Средства языка sql
- •16.7. Резюме
- •17.1. Введение
- •17.2. Пример выполнения оптимизации
- •17.3. Оптимизация запросов
- •17.4. Преобразование выражений
- •17.5. Статистические показатели базы данных
- •17.6. Стратегия по принципу "разделяй и властвуй"
- •17.7. Реализация реляционных операторов
- •17.8. Резюме
- •18.1. Введение
- •18.2. Обзор концепции трехзначной логики
- •18.3. Некоторые следствия изложенной схемы
- •18.4. Отсутствующие значения и ключи
- •18.5. Внешнее соединение
- •18.6. Специальные значения
- •18.7. Поддержка неопределенных значений в языке sql
- •18.8. Резюме
- •Глава 19
- •19.1. Введение
- •19.2. Иерархия типов
- •19.3. Полиморфизм и заменимость
- •19.4. Переменные и операция присвоения
- •19.5. Специализация по ограничениям
- •19.6. Операции сравнения
- •19.7. Операторы, версии и сигнатуры
- •19.8. Является ли окружность эллипсом
- •19.9. Пересмотр специализации ограничением
- •19.10. Резюме
- •20.1. Введение
- •20.2. Предварительные сведения
- •20.3. Двенадцать основных целей
- •1. Локальная независимость
- •2. Отсутствие опоры на центральный узел
- •3. Непрерывное функционирование
- •4. Независимость от расположения
- •5. Независимость от фрагментации
- •6. Независимость от репликации
- •7. Обработка распределенных запросов
- •8. Управление распределенными транзакциями
- •9. Аппаратная независимость
- •10. Независимость от операционной системы
- •11. Независимость от сети
- •12. Независимость от типа субд
- •20.4. Проблемы распределенных систем
- •Транзакция т1х
- •20.5. Системы "клиент/сервер"
- •20.6. Независимость от субд
14.3. Восстановление транзакции
Транзакция начинается в результате успешного выполнения оператора BEGIN TRANSACTION и заканчивается успешным выполнением оператора COMMIT или ROLLBACK. Оператор COMMIT устанавливает так называемую точку фиксации (которая в коммер- ческих продуктах иначе называется точкой синхронизации (syncpoint)). Точка фик- сации соответствует концу логической единицы работы и, следовательно, точке, в ко- торой база данных находится (или будет находиться) в состоянии непротиворечивости.
В противовес этому после выполнения оператора ROLLBACK база данных вновь возвра- щается в состояние, в котором она была в момент начала обработки оператора BEGIN TRANSACTION, т.е. в предыдущую точку фиксации, (Понятие "предыдущая точка фикса- ции" достаточно корректно даже в случае первой транзакции в программе при условии, что первый оператор BEGIN TRANSACTION по умолчанию устанавливает в про- грамме первичную точку фиксации.)
Замечание. В этом разделе термин "база данных" фактически означает доступную для транзакции часть базы данных. Другие транзакции могут выполняться параллельно с данной транзакцией и вносить изменения в собственные части базы данных. Таким обра- зом, "вся база данных" может и не быть в полностью непротиворечивом состоянии в мо- мент фиксации конкретной транзакции. Однако, как объясняется в разделе 14.1, в данной главе игнорируется возможность параллельного выполнения транзакций (поскольку та- кое упрощение существенно не влияет на рассматриваемый вопрос).
Ниже перечислены случаи установки точки фиксации.
Все обновления, совершенные программой с момента установки предыдущей точ- ки фиксации, выполнены, т.е. получили статус постоянных. До достижения точки фиксации все выполненные транзакцией обновления могут расцениваться только как пробные в том смысле, что они могут быть отменены (т.е. существует возмож- ность их отката). Однако гарантируется, что с момента фиксации обновление уже никогда не будет отменено (это и есть определение понятия "зафиксировано").
Утрачена вся информация о позиционировании базы данных и сняты все блокиров- ки кортежей. Позиционирование базы данных в этом контексте означает, что в лю- бой заданный момент выполняющаяся программа обычно адресуется к конкретно- му кортежу (например, посредством определенных курсоров в случае языка 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.
И Долговечность. Если транзакция зафиксирована, выполненные ею обновления сохраняются в базе данных постоянно, даже если в следующий момент произой- дет сбой системы.