Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Базы данных.doc
Скачиваний:
160
Добавлен:
16.03.2016
Размер:
6 Мб
Скачать
☆

22.3.5. Транзакции и ограничения целостности

Материал этого подраздела уже излагался в подразделе 16.3.3. Немедленная и откладываемая проверка ограниченийлекции 16, но там это делалось в контексте определений ограничений целостности. Для полноты картины мы воспроизведем часть этого материала в контексте управления транзакциями.

Итак, любое ограничение целостности обладает атрибутом, определяющим время проверки данного ограничения. Этот атрибут может иметь значения DEFERRABLE(отложенная проверка) илиNOT DEFERRABLE(немедленная проверка). Чтобы данное ограничение целостности могло когда-либо обладать свойством отложенной проверки, нужно, чтобы в определении такого ограничения присутствовали ключевые словаINITIALLY DEFERREDилиINITIALLY IMMEDIATE. В любом случае, в каждый момент времени выполнения транзакции любое ограничение целостности находится в одном из двух состояний –отложенная проверкаилинемедленная проверка. Если начальным состоянием ограничения являетсяINITIALLY DEFERRED, то в начале любой транзакции его текущим состоянием будетотложенная проверка. Аналогично для ограничений с начальным состояниемINITIALLY IMMEDIATE.

Любое ограничение, находящееся в состояниинемедленной проверки, всегда проверяется в конце выполнения любого оператора SQL187). Немедленно проверяются и те ограничения, которые были определены какNOT DEFERRABLE, но для которых впоследствии был установлен режим немедленной проверки. Однако если текущим состоянием ограничения являетсяотложенная проверка, оно будет проверяться только тогда, когда перейдет в состояниенемедленной проверки. Это делается неявно при выполнении оператораCOMMITили явно при выполнении оператораSET CONSTRAINTS. Этот оператор имеет следующий синтаксис:

SET CONSTRAINTS { ALL | constraint_name_commalist}

{ DEFERRED | IMMEDIATE }

Ключевое слово ALLявляется сокращенной формой задания списка имен всех ограничений целостности, определенных в базе данных, которые специфицированы с указанием ключевого словаDEFERRABLE. Если список имен ограничений задается явно, то все входящие в него имена должны соответствовать ограничениям, определенным с указанием ключевого словаDEFERRABLE.

186 При этом экономятся хотя бы ресурсы, требуемые для создания транзакций. Иногда такие цепочки транзакций поэтически называют сагами: если вы когда-нибудь пробовали писать саги, то должны были почувствовать, что это проще, чем писать отдельные сказания.

187 Естественно, на практике проверяются только те ограничения, которые могут быть потенциально нарушены в результате выполнения соответствующего оператора.

При попытке фиксации транзакции, для которой имеются одно или несколько ограничений целостности, текущим режимом которых является отложенная проверка, система (ненадолго, поскольку транзакция скоро тем или иным способом завершится) устанавливает для всех этих ограничений режим немедленной проверки и проверяет ограничения. Если какое-либо из ограничений нарушается, то операцияCOMMITтрактуется как операцияROLLBACK, и пользователю (или приложению) сообщается, что возникла ошибка. Избежать этой неприятной ситуации можно явным выполнением оператораSET CONSTRAINTS ALL IMMEDIATEдо фиксации транзакции, для которой имеютсяDEFERRABLEограничения, текущим режимом которых является отложенная проверка.