Модели транзакций Свойства транзакций. Способы завершения транзакций
Определение Транзакцией называется последовательность операций, производимых над базой данных и переводящих базу данных из одного непротиворечивого (согласованного) состояния в другое непротиворечивое (согласованное) состояние.
Пример Выделим работу по вводу данных о поступивших книгах, новых книгах, которых не было раньше в библиотеке. Тогда эту операцию можно разбить па две последовательные: сначала ввод данных о книге это новая строка в таблице BOOKS, потом ввод данных обо всех экземплярах новой книги это ввод набора новых строк в таблицу EXEMPLAR в количестве, равном количеству поступивших экземпляров книги. Если эта последовательность работ будет прервана, то наша база данных не будет соответствовать реальному объекту, поэтому желательно выполнять ее как единую работу над базой данных.
Типы транзакций плоские или классические транзакции, цепочечные транзакции, вложенные транзакции.
Плоские, или традиционные, транзакции характеризуются четырьмя классическими свойствами: атомарности, согласованности, изолированности, долговечности (прочности) ACID (Atomicity, Consistency, Isolation,Durability). Иногда традиционные транзакции называют ACID-транзакциями.
Свойства Свойство атомарности (Atpmicity) выражается в том, что транзакция должна быть выполнена в целом или не выполнена вовсе. Свойство согласованности (Consistency) гарантирует, что по мере выполнения транзакций данные переходят из одного согласованного состояния в другое - транзакция не разрушает взаимной согласованности данных
Свойства Свойство изолированности (Isolation) означает, что конкурирующие за доступ к базе данных транзакции физически обрабатываются последовательно, изолированно друг от друга, но для пользователей это выглядит так, как будто они выполняются параллельно. Свойство долговечности (Durability) трактуется следующим образом: если транзакция завершена успешно, то те изменения в данных, которые были ею произведены, не могут быть потеряны ни при каких обстоятельствах (даже в случае последующих ошибок).
Фиксация транзакции Если все операторы выполнены успешно и в процессе выполнения транзакции не произошло никаких сбоев программного или аппаратного обеспечения, транзакция фиксируется. Фиксация транзакции ото действие, обеспечивающее запись на диск изменении в базе данных, которые были сделаны в процессе выполнения транзакции.
Откат транзакции Если в процессе выполнения транзакции случилось нечто такое, что делает невозможным ее нормальное завершение, база данных должна быть возвращена в исходное состояние. Откат транзакции это действие, обеспечивающее аннулирование всех изменений данных, которые были сделаны операторами SQL в теле текущей незавершенной транзакции.
Начало транзакции В стандарте ANSI/ISO SQL определены модель транзакций и функции операторов COMMIT и ROLLBACK. Стандарт определяет, что транзакция начинается с первого SQL-оператора, инициируемого пользователем или содержащегося в программе, изменяющего текущее состояние базы данных. Все последующие SQL-операторы составляют тело транзакции.
Транзакция завершается одним из четырех возможных путей 1. оператор COMMIT означает успешное завершение транзакции; его использование делает постоянными изменения, внесенные в базу данных в рамках текущей транзакции; 2. оператор ROLLBACK прерывает транзакцию, отменяя изменения, сделанные в базе данных в рамках этой транзакции; новая транзакция начинается непосредственно после использования ROLLBACK; 3. успешное завершение программы, в которой была инициирована текущая транзакция, означает успешное завершение транзакции (как будто был использован оператор COMMIT); 4. ошибочное завершение программы прерывает транзакцию (как будто был использован оператор ROLLBACK).
Пример транзакций ANSI/ISO
расширенная модель транзакций. Оператор BEGIN TRANSACTION сообщает о начале транзакции Оператор COMMIT TRANSACTION сообщает об успешном завершении транзакции. Он эквивалентен оператору COMMIT в модели стандарта ANSI/ISO. Оператор SAVE TRANSACTION создает внутри транзакции точку сохранения, которая соответствует промежуточному состоянию БД, сохраненному на момент выполнения этого оператора. В операторе SAVE TRANSACTION может стоять имя точки сохранения. Поэтому в Ходе выполнения транзакции может быть запомнено несколько точек сохранения, соответствующих нескольким промежуточным состояниям.
Оператор ROLLBACK Оператор ROLLBACK имеет две модификации. Если этот оператор используется без дополнительного параметра, то он интерпретируется как оператор отката всей транзакции, то есть в этом случае он эквивалентен оператору отката ROLLBACK в модели ANSI/ISO. Если же оператор отката имеет параметр и записан в виде ROLLBACK В, то он интерпретируется как оператор частичного отката транзакции в точку сохранения В.
Журнал транзакций Реализация п СУБД принципа сохранения промежуточных состоянии, подтверждения пли отката транзакции обеспечивается специальным механизмом, для поддержки которого создается некоторая системная структура, называемая Журналом транзакций.
Общие принципы восстановления результаты зафиксированных транзакций должны быть сохранены в восстановленном состоянии базы данных; результаты незафиксированных транзакций должны отсутствовать в восстановленном состоянии базы данных.
ситуации, при которых требуется производить восстановление состояния базы данных. Индивидуальный откат транзакции. Восстановление после внезапной потери содержимого оперативной памяти (мягкий сбой). Восстановление после поломки основного внешнего носителя базы данных(жесткий сбой)
восстановление согласованного состояния базы Для восстановления согласованного состояния базы данных при индивидуальном откате транзакции нужно устранить последствия операторов модификации базы данных, которые выполнялись в этой транзакции.
восстановление согласованного состояния базы Для восстановления непротиворечивого состояния БД при мягком сбое необходимо восстановить содержимое БД по содержимому журналов транзакций, хранящихся па дисках. Для восстановления согласованного состояния БД при жестком сбое надо восстановить содержимое БД по архивным копиям и журналам транзакции, которые хранятся на неповрежденных внешних носителях.
два основных варианта ведения журнальной информации. 1. для каждой транзакции поддерживается отдельный локальный журнал изменений базы данных этой транзакцией. Кроме того, поддерживается общий журнал изменений базы данных, используемый для восстановления состояния базы данных после мягких и жестких сбоев. 2. поддержание только общего журнала изменений базы данных, который используется и при выполнении индивидуальных откатов.
два альтернативных варианта ведения журнала транзакций Протокол с отложенными обновлениями протокол с немедленными обновлениями.
принцип отложенных изменений 1. Когда транзакция Т1 начинается, в протокол заносится запись 2. На протяжении выполнения транзакции в протоколе для каждой изменяемой записи записывается новое значение; Здесь ID_RECORD уникальный номер записи.
Если все действия, из которых состоит транзакция Т1, успешно выполнены, то транзакция частично фиксируется и в протокол заносится После того как транзакция фиксирована, записи протокола, относящиеся к Т1, используются для внесения соответствующих изменений в БД.
Если происходит сбой, то СУБД просматривает протокол и выясняет, какие транзакции необходимо переделать. Транзакцию Т1 необходимо переделать, если протокол содержит обе записи. Если в протоколе не содержится команда фиксации транзакции COMMIT, то никаких действий проводить не требуется, а транзакция запускается заново.
механизм с немедленным выполнением Альтернативный механизм с немедленным выполнением предусматривает внесение изменений сразу в БД, а в протокол заносятся не только новые, но и все старые значения изменяемых атрибутов, поэтому каждая запись выглядит. При этом запись в журнал предшествует непосредственному выполнению операции над БД. Когда транзакция фиксируется, то есть встречается команда и она выполняется, то все изменения оказываются уже внесенными в БД и не требуется никаких дальнейших действий по отношению к этой транзакции. При откате транзакции выполняется системная процедура UNDO(), которая возвращает все Старые значения в отмененной транзакции, последовательно проходя по протоколу начиная с команды BEGIN TRANSACTION