20июн
Транзакция. Немного общей теории.
Что такое ТРАНЗАКЦИЯ. Общее понятие и основные свойства. Некоторые особенности транзакций в СУРБД ORACLE.
Транзакция - одно из фундаментальных понятий, отличающих базу данных от обычной файловой системы и от простого набора таблиц. Поддержание транзакций является основой обеспечения логической целостности баз данных. В многопользовательских системах они составляют основу изолированности пользователей (см. соответствующую статью о пользовательских блокировках). Каждая транзакция начинается при целостном состоянии БД и оставляет это состояние целостным после своего завершения. Поэтому транзакцию можно назвать единицей активности пользователя по отношению к БД. Если СУБД корректно манипулирует совместно выполняющимися транзакциями, то любой пользователей получает иллюзию монопольного владения базой, т.е. пребывает в изолированности. Главная задача транзакций - обеспечить целостность данных в случаях, когда несколько SQL-операторов выполняют зависящие друг от друга изменения данных.
Классический пример транзакции, перевод денег с одного счета на другой:
UPDATE accounts SET AccSum = AccSum - 1000 WHERE AccNumber = 12345;
UPDATE accounts SET AccSum = AccSum + 1000 WHERE AccNumber = 67890;
Что будет, если первый оператор выполнится, а второй по какой-то причине - нет (сбой сервера, неправильный номер счета, переполнение... - мало ли какая может быть ошибка)? Деньги с одного счета списаны, а на другой не поступили...
Механизм транзакций как раз и позволяет корректно выходить из подобных ситуаций. Объединив эти два оператора UPDATE в одну транзакцию, мы обеспечим выполнение (или невыполнение) их обоих как одного целого.
Транзакция - логический блок работы, включающий один или большее количество утверждений SQL, выполненных отдельным пользователем. Транзакция представляется как нечто неделимое и единое целое:
- единое - либо транзакция успешно выполняется, и СУБД фиксирует изменения БД, произведенные этой транзакцией, во внешней памяти, либо ни одно из этих изменений никак не отражается на состоянии БД.
- неделимое - Под транзакцией понимается неделимая последовательность операторов манипулирования данными (чтения, удаления, вставки, модификации) такая, что-либо результаты всех операторов, входящих в транзакцию, отображаются в БД, либо воздействие всех этих операторов полностью отсутствует.
Транзакции базы данных обладают свойствами, сокращенно называемыми ACID (Atomicity, Consistency, Isolation, Durability). Вот что означают эти свойства:
- Неделимость (Atomicity). Транзакция либо выполняется полностью, либо не выполняется.
- Согласованность (Consistency). Транзакция переводит базу данных из одного согласованного состояния в другое.
- Изолированность (Isolation). Результаты транзакции становятся доступны для других транзакций только после ее фиксации.
- Продолжительность (Durability). После фиксации транзакции изменения становятся постоянными.
Транзакции в Oracle полностью соответствуют стандарту SQL-92, но есть только две тонкости:
Транзакции только на чтение. Если транзакция объявлена как "только на чтение" (SET TRANSACTION READ ONLY) - это гарантирует, что любой SELECT, выполненный в рамках этой транзакции, выдаст данные в том состоянии, в каком они были на момент начала транзакции. В пределах транзакции "только на чтение" запрещено любое изменение данных. При этом транзакция "только на чтение" не устанавливает никаких блокировок данных и не мешает изменять эти данные другим сессиям. Часто используется для формирования отчетов (см. соответствующую статью о блокировках).
Автономные транзакции. Реализованный в Oracle механизм автономных транзакций позволяет создать новую транзакцию в пределах текущей. Подтверждение/откат изменений, сделанных в рамках автономной транзакции, производится независимо от родительской транзакции. Автономные транзакции могут быть вложенными, максимальный уровень вложенности определяется настройками сервера.