- •Е.И. Асташева сетевые базы данных
- •Введение
- •1. Введение в базы данных
- •1.1. Что такое база данных
- •1.2. Структура базы данных
- •2. Иерархическая и сетевая модели организации данных
- •3. Реляционная модель базы данных
- •3.1. Домены и отношения
- •3.2. Целостность данных
- •3.3. Реляционная алгебра
- •3.4. Реляционное исчисление
- •4. Проектирование логической структуры базы данных
- •4.1. Концепция функциональной зависимости
- •4.2. Нормализация базы данных
- •4.3. Объектное моделирование
- •5. Функции защиты базы данных
- •5.1. Транзакции и параллелизм
- •5.2. Безопасность и целостность баз данных
- •6. Дополнительные аспекты реляционной технологии
- •6.1. Представления
- •6.2. Повышение производительности с помощью оптимизации
- •6.3. Домены, отношения и типы данных
- •6.4. Неопределенные значения и трехзначная логика
- •6.5. Распределенные базы данных
- •7. Технология физического хранения и доступа к данным
- •7.1. Основные этапы доступа к базе данных
- •7.2. Управление страницами
- •7.3. Процедура индексирования и хеширования
- •7.4. Сжатие данных
- •Заключение
- •Библиографический список
- •Оглавление
- •394026 Воронеж, Московский просп., 14
5. Функции защиты базы данных
5.1. Транзакции и параллелизм
При работе СУБД возникает необходимость защиты БД от возможных случайных или преднамеренных ситуаций, когда существует вероятность потери данных. Например, при доступе к БД сразу нескольких пользователей возможно повреждение или неправильная запись данных, что в свою очередь может привести к непредсказуемым последствиям. Очевидно, что из таких ситуаций СУБД должна уметь корректно выходить. Одним из способов решения этих проблем является механизм транзакций.
Поддержание механизма транзакций - показатель уровня развитости СУБД. Корректное поддержание транзакций одновременно является основой обеспечения целостности БД. Транзакции также составляют основу изолированности пользователей во многопользовательских системах.
Под транзакцией понимается неделимая с точки зрения воздействия на БД последовательность операторов манипулирования данными (чтения, удаления, вставки, модификации) такая, что возможны два итога:
- результаты всех операторов, входящих в транзакцию, соответствующим образом отображаются в БД;
- воздействие всех этих операторов полностью отсутствует.
В СУБД транзакция начинается с оператора BEGIN. При этом если транзакция завершена оператором COMMIT, то результаты фиксируются во внешней памяти; при завершении транзакции оператором ROLLBACK результаты отсутствуют во внешней памяти.
Оператор COMMIT устанавливает так называемую точку фиксации, то есть момент, когда заканчивается логическая единица работы. Следовательно, БД будет находиться в согласованном (целостном) состоянии как в начале, так и в конце транзакции. При завершении транзакции оператором ROLLBACK БД тоже будет находиться в согласованном состоянии, так как никакого влияния на данные такая транзакция не окажет. Здесь под согласованностью будем понимать тот факт, что транзакции переводят БД из одного согласованного состояния в другое, то есть в такое, что выполняются все условия ограничения целостности и.т.п.
В свою очередь, понятие восстановление СУБД - процесс, подразумевающий возвращение БД в правильное состояние, если какой-либо процесс вызвал сбой данных. Восстановление базируется на принципе избыточности БД, при этом по части хранимых данных имеется возможность восстановления всей информации полностью.
Система должна обеспечивать восстановление как после небольших нарушений (например, после неудачно завершенных транзакций), так и после серьезных сбоев (иногда их называют глобальными), например, сбоев питания.
Глобальный сбой полностью действует на СУБД и обычно выделяют два вида: сбой системы, нарушающий все выполняемые в данный момент транзакции, но не нарушающий БД физически, и сбой носителей, который представляет собой физическую угрозу для данных.
Восстановление системы после первого вида глобального сбоя может быть осуществлено по журналу транзакций, в который заносится информация о транзакциях, начавших свое выполнение, и транзакциях, успешно завершившихся. Если после перезагрузки системы в журнале будут встречены транзакции, начавшиеся до сбоя, но не закончившиеся, то для всех них выполняется оператор ROLLBACK, в результате чего БД снова будет находиться в целостном состоянии.
Процесс восстановления после сбоя носителей принципиально иной. Восстановление в этом случае осуществляется с резервной копии БД. Понятно, что для реализации этого процесса необходимо, чтобы в СУБД предусматривалось резервное копирование с помощью соответствующей программной реализации.
Понятие транзакции имеет непосредственную связь с понятием целостности БД. Очень часто БД может обладать такими ограничениями целостности, которые просто невозможно не нарушить, выполняя изменение только одним оператором. Например, в базе данных СТУДЕНТЫ - ПРЕДМЕТЫ -ОЦЕНКИ (см. рис. 4.1) очевидным ограничением целостности является совпадение значения атрибута SN в кортеже отношения СТУДЕНТЫ с аналогичным атрибутом отношения ОЦЕНКИ. В этом случае возникает проблема с добавлением новому студенту оценки по экзамену. Независимо от того, какая операция будет выполнена первой, вставка нового кортежа в отношение СТУДЕНТЫ или в отношение ОЦЕНКИ, после выполнения операции БД окажется в нецелостном состоянии.
Для поддержания подобных ограничений целостности допускается их нарушение внутри транзакции с тем условием, чтобы к моменту завершения транзакции условия целостности должны быть соблюдены. В системах с развитыми средствами ограничения и контроля целостности каждая транзакция начинается при целостном состоянии БД и должна оставить это состояние целостным после своего завершения. Несоблюдение этого условия приводит к тому, что вместо фиксации результатов транзакции происходит ее отмена (то есть откат транзакции, когда она вместо оператора COMMIT завершается оператором ROLLBACK), и БД остается в таком состоянии, в котором находилась к моменту начала транзакции.
В многопользовательских системах с одной БД, вообще говоря, одновременно могут работать несколько пользователей или прикладных программ. Одной из основных задач СУБД является обеспечение изолированности пользователей, то есть создание такого режима работы, чтобы каждому из пользователей казалось, что он работает с БД в одиночку. Такую задачу СУБД принято иногда называть параллелизмом транзакций.
При параллельной обработке БД возникает три основных проблемы:
- проблема потери результатов обновления - заключается в первую очередь в том, что транзакция может быть незавершенна из-за того, что данные, которые она обрабатывает, могут быть модифицированы другой транзакцией;
- проблема незафиксированности зависимости - состоит в том, что транзакция может использовать для работы данные, которые в настоящий момент модифицируются другой транзакцией. Понятно, что первая из них вполне может работать с данными, которые по завершению второй транзакции в БД просто будут отсутствовать;
- проблема несовместимого анализа - связана с тем, что в результате модификации БД транзакцией, другая транзакция может внести в БД некую информацию, которая не будет соответствовать целостному состоянию БД.
Для решения этих проблем используют блокировку - метод управления параллельными процессами, при котором объект БД, например, кортеж не может быть модифицирован без ведома транзакции. То есть результатом блокировки есть блокирование доступа к объекту со стороны других транзакций, чем исключается непредсказуемое изменение объекта.
Различают два вида блокировки:
- блокировка записи - при этом транзакция блокирует кортеж таким образом, что запрос другой транзакции к этому кортежу будет отменен;
- блокировка чтения - в этом случае транзакция блокирует кортеж так, что запрос со стороны другой транзакции на блокировку записи этого кортежа будет отвергнут, а на блокировку чтения - принят.
В СУБД используют протокол доступа к данным, позволяющий избежать проблем параллелизма. Его суть заключается в следующем:
- транзакция, результатом действия которой на кортеж является его извлечение, обязана наложить блокировку чтения на этот кортеж;
- транзакция, предназначенная для модификации кортежа, обязана наложить блокировку записи на этот кортеж;
- в случае, если запрашиваемая блокировка на кортеж отвергается из-за того, что на кортеж уже наложена блокировка, то транзакция переводится в режим ожидания до тех пор, пока блокировка не будет снята.
- блокировка записи сохраняется вплоть до конца выполнения транзакции, то есть до выполнения операторов COMMIT или ROLLBACK.
Решение проблем, параллельной обработки БД, заключается в том, что кортеж блокируется, а последующие транзакции, модифицирующие этот кортеж, отвергаются и переводятся в режим ожидания.
В связи со свойством сохранения целостности БД транзакции являются подходящими единицами изолированности пользователей. Действительно, если каждый сеанс работы с БД реализуется транзакцией, то каждый пользователь начинает работу с согласованным состоянием БД, то есть с таким ее состоянием, в котором она могла бы находиться, даже если бы пользователь работал с ней в одиночку.