Параллельный доступ и согласованность данных
Транзакции
Управление транзакциями в СУБД Oracle
Управление транзакциями в СУБД SQL Server
Изоляция транзакций
Механизм блокировок
Тиражирование
Фиксация изменений в базе данных Oracle
Переключение журналов
Архивирование журналов
Контрольная точка
Последовательные шаги фиксации изменений в базе данных
Фиксация изменений в SQL Server
Запись и удаление страниц буферов
Регистрация транзакций
Литература
Целостность (integrity) данных – взаимная согласованность отдельных фрагментов данных и их корректность. Согласованность (consistency) означает, что все порции в базе данных должны быть единообразно смоделированы и включены в систему.
В многопользовательской среде различные пользователи могут одновременно изменять одни и те же данные. В этом случае возникает проблема согласованности операций, выполняемых несколькими пользователями. Проблема состоит в том, что при обращении к одному и тому же фрагменту данных разными пользователями, сервер базы данных должен гарантировать сохранение достоверности и целостности данных.
Одним из способов обеспечения целостности данных, принятым в системах управления базами данных, является блокировка постороннего доступа к данным в процессе их обработки. Данные блокируются на уровне строки или страницы базы данных, причем, чем меньше объем фрагмента данных, который может быть заблокирован, тем большее количество пользователей могут одновременно работать с базой данных, не мешая друг другу. Чаще всего наименьшей порцией данных, которая может быть заблокирована, является строка. Более крупные фрагменты – блок и страница базы данных. Блокировка на уровне строки лучше обеспечивает доступ со случайным распределением по всему массиву данных, а блокировка на уровне страницы или блока более подходит при продолжительных операциях с близкими по смыслу данными.
Второй способ обеспечения целостности данных – тиражирование изменений фрагмента данных. Если один пользователь изменяет фрагмент данных в тот момент, когда другой пользователь просматривает эти же данные или пытается их изменить, СУБД должна создать несколько копий фрагмента данных, согласовать все внесенные в копии изменения и занести в базу данных единый вариант данных, удовлетворяющий всех пользователей, работающих с этим фрагментом.
Обеспечение параллельного доступа и обеспечение целостности являются тесно связанными функциями СУБД. В основе механизма реализации этих функций лежит понятие транзакции (transaction).
Системы управления базами данных, имеющие архитектуру «клиент – сервер», предполагают одновременное обращение к базе данных большого числа пользователей. При этом достаточно часто пользователи изменяют одни и те же данные. В этом случае возникает проблема целостности и корректности данных – как связать множество копий одних и тех же данных, измененных разными пользователями. Для решения этой проблемы СУБД должна трактовать все операции, адресованные к одному фрагменту данных так, будто они выполняются одним пользователем. Например, один пользователь добавляет отдел с номером 10 в таблицу DEPT и одновременно переводит в него часть служащих из других отделов в таблице EMP, а другой пользователь в это же время составляет штатное расписание по отделам. Если действия первого пользователя не рассматривать, как единую логическую операцию, штатное расписание будет составлено принципиально неверно, т.к. может так получиться, что некоторые сотрудники будут учтены в двух отделах, а некоторые не учтены совсем.
Системы управления данных организуют обновление данных, используя транзакции в качестве логических единиц работы. Транзакция – это несколько последовательных операторов SQL, которые рассматриваются как единое целое. Операторы, входящие в транзакцию, выполняют взаимосвязанные действия: каждый оператор выполняет свою часть задачи, но задача будет выполнена успешно только в том случае, если все команды отработают корректно. Транзакции в реляционной базе данных должны подчиняться следующему правилу:
Операторы, входящие в транзакцию рассматриваются как неделимое целое. Либо все операторы должны быть выполнены успешно, либо не должен быть выполнен ни один оператор.
Транзакция, которая дала ожидаемый результат, называется принятой (committed), в противном случае – отвергнутой (rolled back). СУБД обновляет записи, если транзакция принята или восстанавливает исходные данные, если транзакция отвергнута.
Для управления логикой транзакций используются команды COMMIT, SAVEPOINT и ROLLBACK.
Транзакция начинается автоматически с первой введенной команды манипулирования данными (SELECT, INSERT, UPDATE, DELETE). Далее происходит последовательное выполнение остальных операторов до тех пор, пока не произойдет одно из следующих событий:
§ Транзакция будет принята, если:
§ Пользователь введет команду COMMIT
§ Пользователь выполнит команду определения данных (DDL) или управления данными (DCL)
§ Успешно завершится приложение, выполняющее транзакцию (пользовательское, SQL*Plus и др.)
§ Транзакция будет отвергнута, если:
§ Пользователь введет команду ROLLBACK
§ Аварийно завершится приложение, выполняющее транзакцию
Во время выполнения транзакции изменения данных являются временными до тех пор, пока они не будут приняты. Результаты операций по изменению данных может видеть только тот пользователь, который их вносит. Другие пользователи видят данные такими, какими они были до начала транзакции. Строки, которые меняются в ходе транзакции, блокируются, и другие пользователи не имеют возможности их менять до тех пор, пока транзакция не будет принята или отвергнута.
Транзакция завершается явно:
§ Транзакция будет принята, если пользователь введет команду COMMIT
§ Транзакция будет отвергнута, если пользователь введет команду ROLLBACK
Транзакция завершается неявно:
§ Транзакция будет принята, если
§ пользователь выполнит команду определения данных (DDL) или управления данными (DCL)
§ успешно завершится приложение, выполняющее транзакцию (пользовательское, SQL*Plus и др.)
§ пользователь завершит сеанс
§ Транзакция будет отвергнута, если аварийно завершится приложение или сеанс, выполняющий транзакцию
Подтверждение транзакции
Все внесенные изменения фиксируются с помощью команды COMMIT. В результате выполнения этой команды:
· измененные данные записываются в базу данных, предшествующее состояние данных теряется;
· другие пользователи могут видеть измененные данные;
· снимается блокировка с изменяемых строк, они становятся доступными для изменений другими пользователями;
· удаляются все точки сохранения.
SQL> SELECT * FROM sample;
ENAME COMM
---------- ---------
ADAMS
FORD
SQL> DELETE FROM sample WHERE ename='FORD';
SQL> INSERT INTO sample (ename) VALUES ('STONE');
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.