|
Программирование >> Построение запросов sql
7.2. Транзакции 7.2.1. Понятие транзакции Область организации транзакций и управления ими очень широка. Мы ограничимся рассмотрением наиболее общих вопросов управления транзакциями в пределах языка SQL. Транзакция - это группа операций обработки данных, выполняемых как некоторое неделимое действие над базой данных, осмысленное с точки зрения пользователя. Запись данных в БД производится только при успешном выполнении всех операций группы. Если хотя бы одна из операций группы завершается неуспешно, то БД возвращается к тому состоянию, в котором она была до выполнения первой операции группы. Транзакция реализует некоторую прикладную функцию, например перевод денег с одного счета на другой при оплате услуг по безналичному расчету (снять и положить). Операция перевода денег с банковского счета абонента, производящего оплату безналичным путем, на счет организации, предоставившей услуги газоснабжения, должна составлять единую транзакцию. Иначе может возникнуть ситуация, когда первый SQL-оператор переведет деньги на другой счет, а второй, выполняющий снятие их со счета, не доведет дело до конца из-за непредвиденного сбоя. Транзакции характеризуются четырьмя классическими свойствами: атомарности, согласованности, изолированности, долговечности (прочности) -ACID (Atomicity, Consistency, Isolation, Durability) [1]. Поэтому часто транзакции называют ACID-транзакциями. Эти свойства означают следующее. 1. Свойство атомарности выражается в том, что транзакция должна быть выполнена в целом или не выполнена вовсе. СУБД гарантирует невозможность фиксации некоторой части действий из транзакции в БД. 2. Свойство согласованности гарантирует, что по мере выполнения транзакций данные переходят из одного согласованного состояния в другое, т.е. транзакция не разрушает взаимной согласованности данных. 3. Свойство изолированности означает, что конкурирующие за доступ к базе данных транзакции физически обрабатываются последовательно, изолированно друг от друга, но для пользователей это выглядит так, как будто они выполняются параллельно. Например, для любых двух транзакций Т1 и Т2 справедливо следующее утверждение: Т1 сможет увидеть обновление Т2 только после выполнения Т2, а Т2 сможет увидеть обновление Т1 только после выполнения Т1. 4. Свойство долговечности означает, что если транзакция завершена успешно, то изменения в данных, произведенные в ней, не могут быть потеряны ни при каких обстоятельствах (даже в случае последующих ошибок или сбоя системы). Таким образом, использование транзакций имеет следующие преимущества. 1. Механизм транзакций позволяет обеспечить логическую целостность данных в БД. Другими словами, транзакции - это логические единицы работы, после выполнения которых БД остается в целостном состоянии. 2. Транзакции также являются единицами восстановления данных. Восстанавливаясь после сбоев, система ликвидирует следы транзакций, не успевших успешно завершиться в результате программного или аппаратного сбоя. 3. Механизм транзакций обеспечивает правильность работы в многопользовательских системах при параллельном обращении нескольких пользователей к одним и тем же данным. Рассмотрим подробнее особенности языка SQL для управления транзакциями. 7.2.2. Восстановление данных Восстановление в СУБД означает способность возвращения базы данных в правильное состояние, если какой-то сбой сделал текущее состояние неправильным или подозрительным. Основной принцип восстановления -избыточность. Избыточность обеспечивается фиксацией транзакций, а восстановление - откатом транзакций. Системный компонент СУБД, обеспечивающий ACID-свойства транзакций, называется администратором транзакций. Он содержит команды COMMIT и ROLLBACK. Команда COMMIT завершает текущую транзакцию, выполняя фиксацию сделанных изменений в базе данных. Иногда говорят, что команда COMMIT фиксирует транзакцию. Фиксация транзакции - это действие, обеспечивающее запись на диск изменений в базе данных, сделанных при выполнении транзакции. До тех пор, пока транзакция не зафиксирована, существует возможность аннулирования этих изменений, восстановления базы данных в то состояние, в котором она была на момент начала транзакции. Таким образом, фиксация текущей транзакции означает следующее: - все результаты выполнения транзакции становятся постоянными; - результаты будут видны другим транзакциям (до этого момента все данные, затрагиваемые транзакцией, будут видны пользователю в состоянии на начало текущей транзакции). Команда COMMIT имеет следующий синтаксис: COMMIT [WORK] [RETAIN];. Слово WORK является необязательным, поэтому команда COMMIT WORK полностью аналогична команде COMMIT. Команда COMMIT (иногда называемая жестким подтверждением) освобождает все физические ресурсы, связанные с транзакцией. Использование ключевого слова RETAIN после команды COMMIT означает, что транзакция зафиксируется, но физические ресурсы не будут освобождены. Такое подтверждение иногда называют мягким подтверждением. Оно может быть полезным при выполнении логической задачи, которая включает в себя множество повторений похожих операций. Например, мягкое подтверждение сохраняет открытые в настоящий момент курсоры для выбранных наборов. Команда ROLLBACK выполняет откат транзакции. Откат транзакции - это действие, обеспечивающее аннулирование всех изменений данных, которые были сделаны операторами SQL в теле текущей незавершенной транзакции. Каждый оператор в транзакции выполняет свою часть работы, но для успешного завершения всей работы в целом требуется безусловное завершение всех их операторов. Команда ROLLBACK имеет следующий синтаксис: ROLLBACK [WORK] [RETAIN] [TO [SAVEPOINT] имя точки сохранения];. Как и COMMIT, команда ROLLBACK освобождает ресурсы на сервере. При использовании ROLLBACK RETAIN выделенные ресурсы не освобождаются, курсоры сохраняются. Такой откат следует использовать с большой осторожностью, поскольку отдельные вызовы откатов производятся в ответ на исключение некоторого вида. В таком случае использование ROLLBACK RETAIN также сохранит и причины исключения. Новая транзакция начинается с начала каждого сеанса работы с базой данных. Далее все выполняемые SQL-операторы будут входить в одну транзакцию до тех пор, пока не будет выполнена команда COMMIT или ROLLBACK. Т.е. чтобы начать транзакцию, не требуется выполнять никаких специальных действий. Транзакция начинается автоматически вместе с первым SQL-оператором или непосредственно после окончания предыдущей транзакции. Логически транзакция должна объединять только выполнение взаимосвязанных операций. Так, если делать транзакции очень большими , состоящими из длинной последовательности не связанных между собой операторов, то любой сбой, автоматически выполняющий откат транзакции, повлияет на отмену действий, которые могли бы быть успешно завершены при более коротких транзакциях. Рассмотрим транзакцию Изменить оплату с кодом 6 с 20 на 100, а затем изменить дату оплаты с 06/13/2001 на 06/11/2001 . Предполагается, что пользователь монопольно вводит запросы SQL последовательно один за другим, пользуясь некоторым интерактивным средством (например, IBExpert). Тело транзакции будут составлять следующие запросы: UPDATE PaySumma SET PaySum = 100 WHERE PayFactCD = 6; UPDATE PaySumma SET PayDate = 06/11/2001 WHERE PayFactCD = 6;
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |