Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Bd_mu_lr_2014.docx
Скачиваний:
57
Добавлен:
02.04.2015
Размер:
934.25 Кб
Скачать
  1. Уровни изоляции транзакций

Блокировки снижают возможности параллельного выполнения транзакций и приводят к появлению тупиков, поэтому в стандарте языка 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.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]