Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Тема 14.doc
Скачиваний:
4
Добавлен:
15.07.2019
Размер:
51.2 Кб
Скачать

Тема 14. Надежность данных

Лекция: Ограничения целостности данных. Ссылочная целостность. Разграничения доступа к базе данных. Надежность управления транзакциями. Метаданные как средство поддержания целостности баз данных.

1.Транзакции

Транзакция представляет собой последовательный набор команд Transact-SQL, образующих логически завершенный блок, который выполняется как единое целое. В транзакцию может быть включено от одной команды Transact-SQL до нескольких тысяч команд. Независимо от количества команд в транзакции либо все они будут выполнены, либо ни одна из них не выполнится. Если хотя бы одна из команд не выполнена, происходит откат транзакции. При откате транзакции система восстанавливается в состоянии, в котором она была до начала транзакции. Информация о первоначальном состоянии системы хранится в журнале транзакций.

Большинство действий, выполняемых пользователями в SQL Server, производятся в теле транзакций. По умолчанию каждая команда выполняется как самостоятельная транзакция. При необходимости пользователь может явно указать начало и конец транзакции, чтобы иметь возможность включить в нее несколько команд.

Набор команд, включенных в транзакцию, должен удовлетворять четырем требованиям:

1. Aтомарность (atomicity).

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

2. Согласованность (consistency).

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

3 .Изолированность (isolation).

Изменения данных, выполняемые одной транзакцией, не должны зависеть от изменений, выполняемых другой транзакцией, то есть изменения данных различными транзакциями должны быть изолированными. В противном случае возможны "мертвые" блокировки, в результате чего работа обеих транзакций будет блокирована. Транзакция видит данные либо в состоянии, которое было до начала работы другой транзакции, либо в состоянии после того, как работа второй транзакции была завершена. Одна транзакция не может просмотреть промежуточное состояние данных, изменяемых другой транзакцией. Если транзакция читает несколько раз одни и те же данные, то она должна видеть их каждый раз в том состоянии, в котором они были при первом обращении. Например, если первая транзакция выбирает строки данных, соответствующие определенному логическому условию, то другая транзакция не должна вставлять строки, данных соответствующие этому логическому условию.

4.Устойчивость (durability).

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

Исполнение этих требований берет на себя SQL Server, обеспечивая выполнение всех команд транзакции как единого целого. Начиная выполнение изменения данных, SQL Server накладывает на данные в таблице блокировку таким образом, что ни одна другая транзакция не сможет их прочитать или изменить. Только после того как транзакция будет завершена или отменена, другая транзакция сможет получить доступ к данным. После завершения транзакции SQL Server гарантирует, что измененные данные будут зафиксированы, даже если сразу же после завершения транзакции произойдет сбой компьютера, операционной системы или самого SQL Server.

Распределенные транзакции (Distributed Transaction) используют, когда необходимо обратиться к ресурсам, размещенным в разных базах данных. Распределенная транзакция представляет собой несколько отдельных транзакций, выполняемых локально в каждой базе данных, к которой обращается пользователь. В терминологии распределенных транзакций источник данных, к которому обращается пользователь, называется менеджером ресурсов (Resource Manager). Менеджер ресурсов должен иметь возможность фиксировать и откатывать локальные транзакции, а также координировать свои действия с другими менеджерами ресурсов, включенными в распределенную транзакцию.

Фиксация и откат распределенных транзакций контролируются программным компонентом, называемым менеджером транзакций (Transaction Manager). Менеджер транзакций координирует работу локальных менеджеров ресурсов и гарантирует, что все локальные транзакции будут либо зафиксированы, либо откачены. Не может случиться, что часть транзакций будет зафиксирована, а часть — откачена.

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

Наиболее сложный этап работы распределенных транзакций связан с их завершением. Некоторые распределенные транзакции, обращающиеся к множеству менеджеров ресурсов и изменяющие большое количество данных, могут потребовать длительного времени для своей фиксации. Тем не менее, менеджер транзакций должен гарантировать, что все локальные транзакции будут либо зафиксированы, либо откачены. Если для завершения распределенной транзакции использовать только требование фиксации всех локальных транзакций, то это может привести к проблемам. Часть менеджеров ресурсов может успешно зафиксировать все изменения, сделанные локальными транзакциями, и отправить менеджеру транзакций сообщение об успешной фиксации. В то же время, одна из длительных транзакций может не зафиксироваться и менеджеру транзакции придется отменить все остальные локальные транзакции, но это будет невозможно, так как часть их будет уже зафиксирована.

Вложенными транзакциями (Nested Transaction) называются транзакции, выполнение которых инициируется из тела уже активной транзакции. Использование вложенных транзакций доступно только при работе с явными транзакциями. При использовании автоматических или подразумевающихся транзакций перед началом новой транзакции предыдущая транзакция должна быть завершена. Поэтому эти два вида транзакций не могут использовать вложенные транзакции. Основное назначение вложенных транзакций заключается в поддержке транзакций, выполняемых хранимыми процедурами. Пользователь может обращаться к хранимой процедуре как из уже начатой транзакции, так и непосредственно (не из тела транзакции). Сервер должен в обоих случаях гарантировать целостность данных и соблюдение требований.

Для создания вложенной транзакции пользователю не нужно использовать какие-либо дополнительные команды. Он просто начинает новую транзакцию, не закрыв предыдущую. Завершение транзакций верхнего уровня откладывается до завершения вложенных транзакций. Если транзакция самого нижнего (вложенного) уровня завершена неудачно и откачена, то все транзакции верхнего уровня, включая транзакцию первого уровня, будут откачены.

В транзакциях SQL Server разрешены не все операции. Запрещается выполнение операций, для которых не реализован откат выполняемых действий (сюда относятся, например, создание или изменение базы данных). Для отката таких действий рекомендуется применять архивирование базы данных перед применением запрещенных в транзакциях операций, чтобы при необходимости иметь возможность восстановить базу данных в первоначальном состоянии. Внутри транзакции запрещено использовать следующие команды:

ALTER DATABASE — изменение конфигурации базы данных;

BACKUP LOG — выполнение резервного копирования журнала транзакций;

CREATE DATABASE — создание базы данных;

DISK INIT — использование этой команды связано с обеспечением обратной совместимости;

DROP DATABASE — удаление базы данных;

DUMP TRANSACTION — при выполнении этой команды журнал транзакций подготавливается к считыванию командами резервного копирования BACKUP и RESTORE. Использование этой команды связано с обеспечением обратной совместимости;

LOAD DATABASE — загружает резервную копию базы данных. Эта команда оставлена для обеспечения обратной совместимости.