Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие 700276.doc
Скачиваний:
15
Добавлен:
01.05.2022
Размер:
1.94 Mб
Скачать

5. Функции защиты базы данных

5.1. Транзакции и параллелизм

При работе СУБД возникает необходимость защиты БД от возможных случайных или преднамеренных ситуаций, когда существует вероятность потери данных. Например, при доступе к БД сразу нескольких пользователей возможно повреждение или неправильная запись данных, что в свою очередь может привести к непредсказуемым последствиям. Очевидно, что из таких ситуа­ций СУБД должна уметь корректно выходить. Одним из спосо­бов решения этих проблем является механизм транзакций.

Поддержание механизма транзакций - показатель уровня раз­витости СУБД. Корректное поддержание транзакций одновре­менно является основой обеспечения целостности БД. Транзак­ции также составляют основу изолированности пользователей во многопользовательских системах.

Под транзакцией понимается неделимая с точки зрения воз­действия на БД последовательность операторов манипулирова­ния данными (чтения, удаления, вставки, модификации) такая, что возможны два итога:

- результаты всех операторов, входящих в транзакцию, со­ответствующим образом отображаются в БД;

- воздействие всех этих операторов полностью отсутствует.

В СУБД транзакция начинается с оператора BEGIN. При этом если транзакция завершена оператором COMMIT, то ре­зультаты фиксируются во внешней памяти; при завершении транзакции оператором ROLLBACK результаты отсутствуют во внешней памяти.

Оператор COMMIT устанавливает так называемую точку фиксации, то есть момент, когда заканчивается логическая еди­ница работы. Следовательно, БД будет находиться в согласо­ванном (целостном) состоянии как в начале, так и в конце тран­закции. При завершении транзакции оператором ROLLBACK БД тоже будет находиться в согласованном состоянии, так как никакого влияния на данные такая транзакция не окажет. Здесь под согласованностью будем понимать тот факт, что транзакции переводят БД из одного согласованного состояния в другое, то есть в такое, что выполняются все условия ограничения целост­ности и.т.п.

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

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

Глобальный сбой полностью действует на СУБД и обычно выделяют два вида: сбой системы, нарушающий все выполняе­мые в данный момент транзакции, но не нарушающий БД физи­чески, и сбой носителей, который представляет собой физиче­скую угрозу для данных.

Восстановление системы после первого вида глобального сбоя может быть осуществлено по журналу транзакций, в который заносится информация о транзакциях, начавших свое выполне­ние, и транзакциях, успешно завершившихся. Если после переза­грузки системы в журнале будут встречены транзакции, начав­шиеся до сбоя, но не закончившиеся, то для всех них выполняет­ся оператор ROLLBACK, в результате чего БД снова будет нахо­диться в целостном состоянии.

Процесс восстановления после сбоя носителей принципиаль­но иной. Восстановление в этом случае осуществляется с резерв­ной копии БД. Понятно, что для реализации этого процесса необ­ходимо, чтобы в СУБД предусматривалось резервное копирова­ние с помощью соответствующей программной реализации.

Понятие транзакции имеет непосредственную связь с поня­тием целостности БД. Очень часто БД может обладать такими ограничениями целостности, которые просто невозможно не нарушить, выполняя изменение только одним оператором. Например, в базе данных СТУДЕНТЫ - ПРЕДМЕТЫ -ОЦЕНКИ (см. рис. 4.1) очевидным ограничением целостности является совпадение значения атрибута SN в кортеже отношения СТУДЕНТЫ с аналогичным атрибутом отношения ОЦЕНКИ. В этом случае возникает проблема с добавлением новому студенту оценки по экзамену. Независимо от того, какая операция будет выполнена первой, вставка нового кортежа в отношение СТУДЕНТЫ или в отношение ОЦЕНКИ, после выполнения операции БД окажется в нецелостном состоянии.

Для поддержания подобных ограничений целостности допус­кается их нарушение внутри транзакции с тем условием, чтобы к моменту завершения транзакции условия целостности должны быть соблюдены. В системах с развитыми средствами ограниче­ния и контроля целостности каждая транзакция начинается при целостном состоянии БД и должна оставить это состояние цело­стным после своего завершения. Несоблюдение этого условия приводит к тому, что вместо фиксации результатов транзакции происходит ее отмена (то есть откат транзакции, когда она вместо оператора COMMIT завершается оператором ROLLBACK), и БД остается в таком состоянии, в котором находилась к моменту на­чала транзакции.

В многопользовательских системах с одной БД, вообще гово­ря, одновременно могут работать несколько пользователей или прикладных программ. Одной из основных задач СУБД является обеспечение изолированности пользователей, то есть создание такого режима работы, чтобы каждому из пользователей каза­лось, что он работает с БД в одиночку. Такую задачу СУБД при­нято иногда называть параллелизмом транзакций.

При параллельной обработке БД возникает три основных проблемы:

- проблема потери результатов обновления - заключается в первую очередь в том, что транзакция может быть незавершенна из-за того, что данные, которые она обрабатыва­ет, могут быть модифицированы другой транзакцией;

- проблема незафиксированности зависимости - состоит в том, что транзакция может использовать для работы дан­ные, которые в настоящий момент модифицируются дру­гой транзакцией. Понятно, что первая из них вполне может работать с данными, которые по завершению второй транзакции в БД просто будут отсутствовать;

- проблема несовместимого анализа - связана с тем, что в результате модификации БД транзакцией, другая тран­закция может внести в БД некую информацию, которая не будет соответствовать целостному состоянию БД.

Для решения этих проблем используют блокировку - метод управления параллельными процессами, при котором объект БД, например, кортеж не может быть модифицирован без ведома транзакции. То есть результатом блокировки есть блокирование доступа к объекту со стороны других транзакций, чем исключа­ется непредсказуемое изменение объекта.

Различают два вида блокировки:

- блокировка записи - при этом транзакция блокирует кор­теж таким образом, что запрос другой транзакции к этому кортежу будет отменен;

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

В СУБД используют протокол доступа к данным, позволяю­щий избежать проблем параллелизма. Его суть заключается в следующем:

- транзакция, результатом действия которой на кортеж яв­ляется его извлечение, обязана наложить блокировку чте­ния на этот кортеж;

- транзакция, предназначенная для модификации кортежа, обязана наложить блокировку записи на этот кортеж;

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

- блокировка записи сохраняется вплоть до конца выпол­нения транзакции, то есть до выполнения операторов COMMIT или ROLLBACK.

Решение проблем, параллельной обработки БД, заключается в том, что кортеж блокируется, а последующие транзакции, моди­фицирующие этот кортеж, отвергаются и переводятся в режим ожидания.

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