Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Базы Данных - Сибилев, 2007

.pdf
Скачиваний:
290
Добавлен:
11.05.2015
Размер:
1.93 Mб
Скачать

 

 

 

 

 

261

 

 

 

 

 

 

 

 

 

 

ID1

 

 

 

 

 

 

 

GRANT...

 

 

 

 

GRANT...

 

 

 

 

ON A TO ID3

 

 

 

ON A TO ID2

 

 

 

 

 

 

 

 

WITH GRANT OPTION

 

 

 

ID4

 

 

 

 

 

?

 

 

GRANT...

 

 

GRANT...

ID2

?

 

ON A TO ID3

 

ON A TO ID3

 

 

WITH GRANT OPTION

ID3

 

 

 

 

 

 

 

 

 

 

Рис. 5.5 Отмена привилегии

Этот пример показывает, что параметр WITH GRANT OPTION в

операторе GRANT нужно использовать осторожно. Стандарт определяет ряд правил наследования и отмены привилегий, которые помогают разо-

браться в подобных ситуациях. Нет необходимости обсуждать здесь эти правила. Сведения о них можно найти в [Ошибка! Источник ссылки не

найден.].

7.6 Управление транзакциями

7.6.1 Модель транзакции

Согласно стандарту, ID (пользователь или прикладная программа)

может выполнить транзакцию всегда. Для того чтобы начать транзакцию,

не требуется предпринимать никаких специальных действий. Транзакция начинается автоматически с первым оператором SQL или непосредствен-

но по окончании предыдущей транзакции. Транзакция может завершиться одним из четырёх способов:

фиксацией внесённых изменений;

отменой проделанных изменений (откатом);

успешным завершением прикладной программы с фиксацией из-

менений, внесённых последней исполнявшейся транзакцией;

− аварийным завершением прикладной программы с откатом по-

следней исполнявшейся транзакции.

В двух последних случаях новая транзакция не начинается, посколь-

ку прикладная программа завершилась.

Стандарт допускает неполную изолированность транзакций, посколь-

ку обеспечение полной изолированности требует, как правило, очень боль-

262

ших затрат на блокировки. Система может существенно уменьшить эти за-

траты, если будет заранее знать, какой уровень изолированности требуется реально. Для каждой транзакции может быть установлен индивидуальный

уровень изолированности. Стандартные обозначения уровней изолирован-

ности и степень влияния других транзакций характеризует таблица 7.4.

Таблица 7.4 – Уровни изолированности транзакции

Стандартное обозначе-

«Грязные»

Неповторяющиеся

Фантомы

ние

чтения

чтения

 

 

 

 

SERIALIZABLE

НЕТ

НЕТ

НЕТ

REPEATABLE READ

НЕТ

НЕТ

ДА

READ COMMITED

НЕТ

ДА

ДА

READ UNCOMMITED

ДА

ДА

ДА

По умолчанию для любой транзакции установлен высший уровень изолированности – SERIALIZABLE. Параллельно исполняющиеся тран-

закции никак не влияют на данные, которые она использует.

Уровень REPEATABLE READ допускает появление строк-

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

На уровне READ COMMITED возможны неповторяющиеся чтения.

Он является вполне удовлетворительным, если транзакции не потребуется дважды считывать одну и ту же строку, накапливать итоги или выполнять вычисления, для которых необходимы непротиворечивые данные.

В режимах REPEATABLE READ и READ COMMITED на транзак-

цию могут повлиять только окончательные (зафиксированные) результаты параллельно исполняющихся транзакций. В режиме READ UNCOMMITED ей доступны и промежуточные результаты. Этот режим можно использовать лишь в том случае, когда допустимы «грязные» дан-

ные в результатах запросов.

Какой бы уровень изолированности ни был установлен для транзак-

ции, система гарантирует сохранение внесённых ею изменений в случае успешного завершения.

263

Рассмотрим теперь синтаксис операторов управления транзакциями.

7.6.2 Оператор SET TRANSACTION

Оператор определяет уровень изолированности транзакции и режим изменения данных во время её исполнения. Оператор может быть испол-

нен только в момент, когда в сеансе нет активной транзакции. Специфика-

ции принимаются для следующей транзакции. Синтаксис оператора сле-

дующий:

SET TRANSACTION

{

{ ISOLATION LEVEL

{

READ UNCOMMITED

| READ COMMITED

| REPEATABLE READ

| SERIALIZABLE

}

}

| { READ ONLY | READ WRITE }

| { DIAGNOSTICS SIZE число_сообщений} }.,..;

За предложением ISOLATION LEVEL обязательно должен следо-

вать один из параметров, характеризующих уровень изолированности.

Предложения READ ONLY и READ WRITE сообщают, будут ли данные только извлекаться или будут ещё и обновляться. Зная это, система сможет установить подходящие режимы блокировки объектов,

используемых транзакцией. Если заранее известно, что данные обновляться не будут, то следует указать READ ONLY. Это обеспечит повышение производительности всех параллельно работающих транзакций.

264

Предложение DIAGNOSTICS SIZE определяет количество элемен-

тов, используемых для хранения сообщений об ошибках. Параметр

число_сообщений должен быть положительным целым числом.

Оператор должен удовлетворять следующим условиям.

Если предложение ISOLATION LEVEL не указано, то подразу-

мевается уровень изолированности SERIALIZABLE.

Если задан параметр READ WRITE, то уровень изолированности не может быть READ UNCOMMITED.

Если указан уровень READ UNCOMMITED, то автоматически устанавливается параметр READ ONLY. В противном случае по умолчанию используется READ WRITE.

Пример.

SET TRANSACTION

ISOLATION LEVEL REPEATABLE READ,

DIAGNOSTICS SIZE 10;

Для следующей за этим оператором транзакции устанавливается уровень изолированности, гарантирующий отсутствие неповторяющихся чтений. Строки-фантомы допускаются. Режим исполнения транзакции

READ WRITE. Резервируется 10 областей для записи диагностических сообщений.

7.6.3 Операторы COMMIT и ROLLBACK

Эти операторы определяют способ завершения транзакции.

Предложение

COMMIT [ WORK ];

сообщает системе, что транзакция завершена успешно и следует попытать-

ся зафиксировать внесённые изменения в ФБД. Эта попытка может ока-

заться неуспешной, поскольку перед фиксацией выполняются все отло-

женные проверки ограничений. Если какое-либо из них нарушено, про-

изойдёт автоматический откат транзакции и будет выдано сообщение об

265

ошибке. Изменения могут быть не зафиксированы также из-за системного сбоя.

Оператор

ROLLBACK [ WORK ];

прекращает исполнение текущей транзакции и отменяет все внесённые изменения. Этот оператор никогда не может завершиться аварийно или остаться невыполненным.

В синтаксисе обоих операторов слово WORK смысловой нагрузки не несёт и может быть опущено.