Методическое пособие 341
.pdfФГБОУ ВПО «Воронежский государственный технический университет»
Кафедра систем информационной безопасности
МЕТОДИЧЕСКИЕ УКАЗАНИЯ
к лабораторным работам № 6–9 по дисциплинам «Основы построения защищенных СУБД»,
«Безопасность систем баз данных» для студентов специальностей 090301 «Компьютерная безопасность», 090303 «Информационная безопасность автоматизированных систем»
очной формы обучения
Воронеж 2015
Составитель канд. техн. наук Д. Г. Плотников
УДК 004.056.5
Методические указания к лабораторным работам № 6–9
по дисциплинам «Основы построения защищенных СУБД», «Безопасность систем баз данных» для студентов специальностей 090301 «Компьютерная безопасность», 090303 «Информационная безопасность автоматизированных систем» очной формы обучения / ФГБОУ ВПО «Воронежский государственный технический университет»; сост. Д. Г. Плотников. – Воронеж, 2015. 65 с.
Выполняя лабораторные работы, студенты получают знания и навыки по современным базам данных и системам управления базами данных, в частности для построения систем баз данных, управления данными с помощью языка SQL и других средств современных СУБД. В издании рассматриваются реляционные базы данных и системы управления базами данных.
Методические указания подготовлены в электронном виде в текстовом редакторе MS Word 2013 и содержатся в файле Плотников_ЛР_БД_6-9.pdf.
Табл. 7. Ил. 8. Библиогр.: 7 назв.
Рецензент д-р техн. наук, проф. А.Г. Остапенко
Ответственный за выпуск зав. кафедрой д-р техн. наук, проф. А.Г. Остапенко
Издается по решению редакционно-издательского совета Воронежского государственного технического университета
© ФГБОУ ВПО «Воронежский государственный технический университет», 2015
Лабораторная работа № 6 Управление транзакциями
Цель работы
Освоение способов управления транзакциями в среде
MS SQL Server.
Темы для предварительной проработки
•Свойства транзакций и управление транзакциями.
•Уровни изоляции.
Подготовка к работе
Подготовить SQL-скрипты для выполнения проверок изолированности транзакций. Ваши скрипты должны работать с одной из таблиц, созданных в лабораторной работе №2.
Выполнение работы
•Запустить Microsoft Query Analyzer и соединиться
сбазой данных. Открыть второе окно для ввода текста запросов (Ctrl+N в первом окне).
•Установить в обоих сеансах уровень изоляции READ UNCOMMITTED . Выполнить сценарии проверки:
потерянных изменений,
грязного чтения.
•Записать протокол выполнения сценариев.
•Установить в обоих сеансах уровень изоляции READ COMMITTED. Выполнить сценарии проверки:
грязного чтения.
неповторяющегося чтения.
•Записать протокол выполнения сценариев.
•Установить в обоих сеансах уровень изоляции REPEATABLE READ. Выполнить сценарии проверки:
неповторяющегося чтения, фантома.
•Записать протокол выполнения сценариев.
•Установить в обоих сеансах уровень изоляции SERIALIZABLE. Выполнить сценария проверки фантома. Записать протокол выполнения сценария.
•Закончить работу с Microsoft Query Analyzer.
Содержание отчета
•Сценарий и протокол его выполнения в среде
Microsoft Query Analyzer.
•Краткие выводы о навыках, приобретенных в ходе выполнения работы.
Теоретические сведения
Уровни изоляции
Стандарт SQL/92 определяет уровни изоляции транзакций в многопользовательской системе через отсутствие таких аномалий доступа к базе данных, которые могут в конечном итоге угрожать целостности данных. В стандарте различаются следующие аномалии:
Потерянные изменения. Транзакция Т1 читает данные. Транзакция Т2 читает те же данные. Транзакция T1 на основании прочитанного значения вычисляет новое значение данных, записывает его в базу данных и завершается. Транзакция T2 на основании прочитанного значения вычисляет новое значение данных, записывает его в базу данных и завершается. В результате значение, записанное транзакцией Т2, "затрет" значение, записанное транзакцией Т1.
Грязное чтение. Транзакция Т1 изменяет некоторые данные, но еще не завершается. Транзакция Т2 читает эти же данные (с изменениями, внесенными транзакцией Т1) и принимает на их основе какие-то
2
решения. Транзакция Т1 выполняет откат. В результате решение, принятое транзакцией Т2 основано на неверных данных.
Неповторяющееся чтение. Транзакция Т1 в ходе своего выполнения несколько раз читает одни и те же данные. Транзакция Т2 в интервалах между чтениями транзакцией Т1 изменяет эти данные и фиксируется. В результате оказывается, что чтения одних и тех же данных в транзакции Т1 дает разные результаты.
Фантом. Транзакция Т1 в ходе своего выполнения несколько раз выбирает множество строк по одним и тем же критериям. Транзакция Т2 в интервалах между выборками транзакции Т1 добавляет или удаляет строки или изменяет столбцы некоторых строк, используемых в критерии выборки, и фиксируется. В результате оказывается, что одни и те же выборки в транзакции Т1 выбирают разные множество строк.
Промышленные СУБД в том или ином объеме выполняют требования стандарта по дифференциации уровней изоляции, но при формально одном и том же уровне изоляции поведение транзакций может существенно различаться в разных СУБД.
Определение уровней изоляции в стандарте и в рассматриваемых нами СУБД сведено в табл. 1:
3
|
|
|
|
|
|
|
|
|
|
|
|
Таблица 1 |
|
|
|
|
|
|
Определение уровней изоляции |
|
|
||||
Уровни |
|
АНОМАЛИИ |
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
Microsoft SQL |
|
|
|
|
|
|
|
|
Неповто- |
|
|
|
|
|
||
изоляции |
|
Потерянные |
|
Грязное |
|
|
Фантом |
|
DB2 |
Oracle |
||
SQL/92 |
|
изменения |
|
чтение |
|
ряющееся |
|
|
Server |
|
|
|
|
|
|
чтение |
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
READ |
|
нет |
|
да |
|
да |
|
да |
|
READ |
UNCOMMITTED |
- |
UNCOMMITTED |
|
|
|
|
|
|
|
|
|
UNCOMMITTED |
READ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
READ |
|
нет |
|
нет |
|
да |
|
да |
|
READ |
CURSOR |
READ |
COMMITTED |
|
|
|
|
|
COMMITTED |
STABILITY |
COMMITTED |
||||
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
REPEATABLE |
|
нет |
|
нет |
|
нет |
|
да |
|
REPEATABLE |
READ |
- |
READ |
|
|
|
|
|
READ |
STABILITY |
|||||
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
SERIALIZABLE |
|
нет |
|
нет |
|
нет |
|
нет |
|
SERIALIZABLE |
REPEATABLE |
SERIALIZABLE |
|
|
|
|
|
READ |
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4
Сценарии
Мы приводим сценарии проверки нежелательных ситуаций на примере таблицы EXAMPLE (табл. 2), структура и содержимое которой приведены ниже. Вам предстоит разработать подобные сценарии, работающие с одной из таблиц, созданных Вами в работе № 2.
Таблица 2
Таблица EXAMPLE
id INTEGERdat INTEGER
1 |
|
100 |
|
|
|
|
|
|
2 |
|
110 |
|
|
|
3 |
|
120 |
|
|
|
4 |
|
130 |
|
|
|
|
|
|
5 |
|
140 |
|
|
|
|
|
|
6 |
|
150 |
|
|
|
7 |
|
160 |
|
|
|
|
|
|
8 |
|
170 |
|
|
|
|
|
|
9 |
|
180 |
|
|
|
10 |
|
190 |
|
|
|
11 |
|
200 |
|
|
|
Ниже приводятся сценарии проверок (табл. 3). Сценарии должны выполняться пошагово, что приводит к тому, что транзакции Т1 и Т2 выполняются параллельно в разных сеансах. Мы подразумеваем, что после выполнения каждого сценария мы восстанавливаем исходное содержимое таблицы
EXAMPLE.
5
|
|
|
|
|
Таблица 3 |
||
|
|
|
Сценарии проверок |
|
|||
|
|
|
|
|
|
|
|
|
Шаг |
|
Транзакция T1 |
|
Транзакция T2 |
|
|
|
|
|
|
|
|
||
|
1. Потерянные изменения |
|
|
|
|
||
|
|
|
|
|
|||
|
1 |
|
BEGIN TRANSACTION |
|
BEGIN TRANSACTION |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2 |
|
UPDATE example SET |
|
|
|
|
|
|
dat=101 WHERE id=1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
3 |
|
|
|
UPDATE example SET |
|
|
|
|
|
|
dat=102 WHERE id=1 |
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|||
|
4 |
|
|
|
COMMIT |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
5 |
|
COMMIT |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
Если потерянные изменения допускаются, то сценарий |
|
|||||
|
выполнится без ошибок и блокировок. В базе данных |
|
|||||
|
сохранится изменение, сделанное на шаге 2. |
|
|||||
|
|
|
|
|
|
||
|
2. Грязное чтение |
|
|
|
|
||
|
|
|
|
|
|||
|
1 |
|
BEGIN TRANSACTION |
|
BEGIN TRANSACTION |
|
|
|
|
|
|
|
|
|
|
2SELECT * FROM example WHERE id=1
3 |
|
|
|
UPDATE example SET |
|
|
|
dat=101 WHERE id=1 |
|
|
|
|
|
|
|
|
|
|
|
4SELECT * FROM example WHERE id=1
5 |
|
|
|
ROLLBACK |
|
|
|
|
|
6SELECT * FROM example WHERE id=1
Если допускается незавершенное чтение, то сценарий выполнится без ошибок и блокировок. На шаге 2 будут выбраны значения (1,100). На шаге 3 -(1,101). На шаге 4 - (1,100).
6
|
|
|
|
|
|
|
Продолжение табл. 3 |
||
|
|
|
|
|
|
|
|
|
|
|
Шаг |
|
Транзакция T1 |
|
|
Транзакция T2 |
|
||
|
|
|
|
|
|
||||
|
3. Неповторяющееся чтение |
|
|
|
|
||||
|
|
|
|
|
|
|
|
||
|
1 |
|
BEGIN TRANSACTION |
|
BEGIN |
|
|||
|
|
|
TRANSACTION |
|
|
||||
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
2 |
|
SELECT * |
FROM |
example |
|
|
|
|
|
|
WHERE id=1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
3 |
|
[COMMIT] |
|
|
|
UPDATE example SET |
|
|
|
|
|
|
|
dat=101 WHERE id=1 |
|
|
||
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|||
|
4 |
|
|
|
|
|
COMMIT |
|
|
|
|
|
|
|
|
|
|
|
|
|
5 |
|
SELECT * |
FROM |
example |
|
|
|
|
|
|
WHERE id=1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
6 |
|
COMMIT |
|
|
|
|
|
|
Если допускается неповторяющееся чтение, то сценарий
выполнится без ошибок и блокировок. Операцию COMMIT на шаге 3 выполнять не придется. На шаге 2 будут выбраны значения (1,100). На шаге 3 - (1,101).
4. Фантом (пример для READ UNCOMMITTED)
1 |
|
BEGIN TRANSACTION |
|
BEGIN |
|
|
TRANSACTION |
||
|
|
|
|
|
|
|
|
|
|
2SELECT * FROM example WHERE dat>180
3 |
|
[COMMIT] |
|
INSERT INTO example |
|
|
VALUES(12,210) |
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4 |
|
|
|
COMMIT |
|
|
|
|
|
5SELECT * FROM example WHERE dat>180
6 COMMIT
Если допускается фантом, то сценарий выполнится без
ошибок и блокировок. Операцию COMMIT на шаге 3 выполнять не придется. На шаге 2 будут выбраны значения (10,190), (11,200). На шаге 3 - (10,190), (11,200), (12,210).
7
|
|
|
|
|
|
Окончание табл. 3 |
||
|
|
|
|
|
|
|
||
Шаг |
|
Транзакция T1 |
|
|
Транзакция T2 |
|
||
|
|
|
||||||
5. Тупик (пример для REPEATABLE READ) |
|
|
||||||
|
|
|
|
|
|
|
||
1 |
|
SELECT |
id from |
exampe |
|
|
|
|
|
WHERE dat=120 |
|
|
|
|
|
||
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
SELECT |
id from |
|
2 |
|
|
|
|
|
exampe |
WHERE |
|
|
|
|
|
|
|
dat=130 |
|
|
|
|
|
|
|
|
|||
3 |
|
UPDATE |
example SET id=3 |
|
|
|
|
|
|
WHERE dat=130 |
|
|
|
|
|
||
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4 |
|
|
|
|
|
UPDATE example SET |
|
|
|
|
|
|
|
id=4 WHERE dat=120 |
|
||
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|||
|
|
|||||||
Если система не обнаруживает и не устраняет тупиков, то |
|
|||||||
после выполнения шага 4 транзакции должны взаимно |
|
|||||||
заблокироваться. |
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
Инструментальные средства Microsoft SQL Server
Для выполнения сценариев проверки изолированности следует открыть два окна внутри Microsoft Query Analyzer (либо два экземпляра Microsoft Query Analyzer)
Для того чтобы набор операторов выполнялся внутри транзакции, следует заключить их между строчками BEGIN
TRANSACTION и COMMIT:
BEGIN TRANSACTION
...
...
COMMIT
8