- •Министерство образования и науки российской федерации
- •Лабораторная работа 1. Создание и заполнение таблиц базы данных. Часть 1.
- •Базы данных и субд
- •Таблицы
- •Типы данных sql
- •Ссылочная целостность
- •Выполнение лабораторной работы
- •Изменение данных
- •Удаление данных
- •Изменение определения таблицы
- •Выполнение лабораторной работы
- •Разработка запросов
- •Выполнение лабораторной работы
- •Директивы, используемые в условиях запросов
- •Выполнение лабораторной работы
- •Объединение, пересечение, разность запросов
- •Выполнение лабораторной работы
- •Экзистенциальные запросы
- •Выполнение лабораторной работы
- •Хранимые процедуры
- •Выполнение лабораторной работы
- •Содержание отчета
- •Варианты заданий
- •Лабораторная работа 8 — Разработка триггеров
- •Виды триггеров
- •Создание триггеров в диалекте Transact sql
- •Выполнение лабораторной работы
- •Рекомендации по выбору индексов
- •Операторы языка sql для создания и удаления индексов
- •Генерация тестовых данных
- •Анализ использования индексов
- •Выполнение лабораторной работы
- •Проблемы многопользовательского доступа к данным, их решение с помощью блокировок
- •Уровни изоляции транзакций
- •Конфигурирование блокировок, отчеты о блокировках
- •Выполнение лабораторной работы
- •Основные объекты и виды репликации
- •Организация репликации транзакций
- •Выполнение репликации транзакций
- •Выполнение лабораторной работы
- •Схемы хранилищ данных
- •Проектирование хранилища
- •Реализация хранилища
- •Выполнение лабораторной работы
- •Содержание отчета
- •Варианты заданий
- •Библиографический список
- •Содержание
Уровни изоляции транзакций
Блокировки снижают возможности параллельного выполнения транзакций и приводят к появлению тупиков, поэтому в стандарте языка SQL предложены 4 уровня изоляции транзакций. Выбирая уровень изоляции транзакций, разработчик БД может повлиять на логику работы блокировок. В зависимости от выбранного уровня изоляции транзакций допускается или исключается появление в БД следующих ситуаций:
(i) dirty read — «грязное» чтение, данная ситуация возникает, когда транзакция читает незафиксированные данные, измененные другой транзакцией:
Момент времени |
Транзакция А |
Транзакция B |
t1 —————— |
begin transaction |
———————————— |
t2—————— |
———————————— |
begin transaction |
t3—————— |
update Счет set Сумма = Сумма - 100 where Номер = 777 |
———————————— |
t4—————— |
———————————— |
select sum(Сумма) from Счет where Номер< 1000 |
t5—————— |
———————————— |
commit transaction |
t6—————— |
rollback transaction |
———————————— |
Рис. 7
Как следует из рис. 7 транзакция B, получила значение суммы, не соответствующее состоянию БД.
(ii) non-repeatable read — неповторяемое чтение, данная ситуация возникает, когда транзакция дважды читает данные и получает различные значения из-за изменений, сделанных другой транзакцией:
Момент времени |
Транзакция А |
Транзакция B |
t1 —————— |
begin transaction |
———————————— |
t2—————— |
———————————— |
begin transaction |
t3—————— |
select СуммаfromСчет where Номер= 777 |
———————————— |
t4—————— |
———————————— |
update Счет set Сумма = Сумма - 100 where Номер = 777 |
t5—————— |
———————————— |
commit transaction |
t6—————— |
select СуммаfromСчет where Номер= 777 |
———————————— |
t6—————— |
commit transaction |
———————————— |
Рис. 8
Как следует из рис. 8, транзакция A дважды выполняя один и тот же запрос, получает различные результаты.
(iii) phantom rows — фантомные строки, данная ситуация возникает, когда одна транзакция отбирает набор данных запросом по некоторому условию, вторая транзакция добавляет, удаляет или изменяет данные, так что строки перестают или начинают удовлетворять условию запроса, после чего первая транзакция повторяет запрос и получает другой набор данных:
Момент времени |
Транзакция А |
Транзакция B |
t1 —————— |
begin transaction |
———————————— |
t2—————— |
———————————— |
begin transaction |
t3—————— |
select * from Счет where Номер< 1000 |
———————————— |
t4—————— |
———————————— |
insert into Счетvalues (999, ‘Сыроежкин’, 200) |
t5 —————— |
———————————— |
commit transaction |
t6 —————— |
select * from Счет where Номер< 1000 |
———————————— |
t6 —————— |
commit transaction |
———————————— |
Рис. 9
Как следует из рис. 9, транзакция A дважды выполняя один и тот же запрос, получит различные наборы данных. Случаи (ii) и (iii) могут показаться похожими, основное отличие в том, что в (ii) речь идет о стабильности отдельных строк, а в (iii) — наборов строк (диапазонов).
Исключить появление рассмотренных ситуаций в БД можно, изменяя уровни изоляции транзакций:
Таблица 2
Уровни изоляции транзакций
Номер |
Наименование |
dirty read |
non-repeatable read |
phantom rows |
0 |
read uncommitted |
Да |
Да |
Да |
1 |
read committed |
Нет |
Да |
Да |
2 |
repeatable read |
Нет |
Нет |
Да |
3 |
serializable |
Нет |
Нет |
Нет |
Как следует из таблицы 2, на самом низком уровне изоляции (read committed) проявляются все рассмотренные выше ситуации, повышение уровня изоляции последовательно приводит к их исключению. На самом высоком уровне изоляции (serializable) транзакции выполняются так, как если бы работа с БД происходила последовательно. Низкие уровни изоляции транзакций снижают вероятность возникновения тупиков и повышают параллелизм, так как на этих уровнях СУБД изменяет логику работы блокировок, отступая от рассмотренной в п. 2 ().
Установку текущего уровня изоляции транзакций осуществляет директива set transaction isolation level { read committed | read uncommitted | repeatable read | serializable 1}. Установленный уровень изоляции транзакций действует до конца сеанса или до тех пор, пока не будет изменен другой директивой set transaction isolation level. Получить значение текущего уровня изоляции транзакций можно, или выполнив директиву dbcc useroptions (MS SQL) или опросив глобальную системную переменную @@isolation (в MS SQL не поддерживается).
Задать уровень изоляции для отдельного запроса или таблицы, не изменяя уровень изоляции, установленный для сеанса, можно с помощью табличных подсказок — hints (http://msdn.microsoft.com/ru-ru/library/ms187373%28SQL.105%29.aspx)2.