КаталогОглавлениеИндекс раздела


Справка. Управление транзакциями

Уровни изоляции

Стандарт SQL/92 определяет уровни изоляции транзакций в многопользовательской системе через отсутствие таких аномалий доступа к базе данных, которые могут в конечном итоге угрожать целостности данных. В стандарте различаются следующие аномалии:

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

Определение уровней изоляции в стандарте и в рассматриваемых нами СУБД сведено в таблицу:

Уровни изоляции SQL/92 АНОМАЛИИ DB2 Oracle
Потерянные изменения Грязное чтение Неповторяющееся чтение Фантом
READ UNCOMMITTED нет да да да UNCOMMITTED READ -
READ COMMITTED нет нет да да CURSOR STABILITY READ COMMITTED
REPEATABLE READ нет нет нет да READ STABILITY -
SERIALIZABLE нет нет нет нет REPEATABLE READ SERIALIZABLE

Сценарии

Мы приводим сценарии проверки нежелательных ситуаций на примере таблицы EXAMPLE, структура и содержимое которой приведены ниже. Вам предстоит разработать подобные сценарии, работающие с одной из таблиц, созданных Вами в работе ╧2.

Таблица EXAMPLE
id INTEGER dat INTEGER
1 100
2 110
3 120
4 130
5 140
6 150
7 160
8 170
9 180
10 190
11 200
Ниже приводятся сценарии проверок. Сценарии должны выполняться пошагово, что приводит к тому, что транзакции Т1 и Т2 выполняются параллельно в разных сеансах. Мы подразумеваем, что после выполнения каждого сценария мы восстанавливаем исходное содержимое таблицы EXAMPLE.

Шаг Транзакция T1 Транзакция T2
1. Потерянные изменения
1 UPDATE example SET dat=101 WHERE id=1  
2   UPDATE example SET dat=102 WHERE id=1
4   COMMIT
3 COMMIT  
Если потерянные изменения допускаются, то сценарий выполнится без ошибок и блокировок. В базе данных сохранится изменение, сделанное на шаге 1.
2. Грязное чтение
1 SELECT * FROM example WHERE id=1  
2   UPDATE example SET dat=101 WHERE id=1
3 SELECT * FROM example WHERE id=1  
4   ROLLBACK
5 SELECT * FROM example WHERE id=1  
Если допускается незавершенное чтение, то сценарий выполнится без ошибок и блокировок. На шаге 1 будут выбраны значения (1,100). На шаге 2 - (1,101). На шаге 3 - (1,100).
3. Неповторяющееся чтение
1 SELECT * FROM example WHERE id=1  
2 [COMMIT] UPDATE example SET dat=101 WHERE id=1
3   COMMIT
4 SELECT * FROM example WHERE id=1  
5 COMMIT  
Если допускается неповторяющееся чтение, то сценарий выполнится без ошибок и блокировок. Операцию COMMIT на шаге 2 выполнять не придется. На шаге 1 будут выбраны значения (1,100). На шаге 2 - (1,101).
4. Фантом
1 SELECT * FROM example WHERE dat>180  
2 [COMMIT] INSERT INTO example VALUES(12,210)
3   COMMIT
4 SELECT * FROM example WHERE dat>180  
5 COMMIT  
Если допускается фантом, то сценарий выполнится без ошибок и блокировок. Операцию COMMIT на шаге 2 выполнять не придется. На шаге 1 будут выбраны значения (10,190), (11,200). На шаге 2 - (10,190), (11,200), (12,210).
5. Тупик
1 UPDATE example SET dat=101 WHERE id=1  
2   UPDATE example SET dat=112 WHERE id=2
3 UPDATE example SET dat=111 WHERE id=2  
4   UPDATE example SET dat=102 WHERE id=1
Если система не обнаруживает и не устраняет тупиков, то после выполнения шага 4 транзакции должны взаимно заблокироваться.

Инструментальные средства DB2

Для выполнения сценариев проверки изолированности следует запустить два сеанса интерактивного SQL. Можно запустить в два сеанса DB2 Command Center, однако, Command Center - приложение довольно ресурсоемкое, и его выполнение в двух экземплярах на компьютере недостаточной мощности может оказаться затруднительным, поэтому мы предлагаем во втором сеансе запустить DB2 Command Line Processor. Command Line Processor - приложение для интерактивного выполнения операторов SQL из командной строки.

По умолчанию в средах интерактивного SQL DB2 режим AUTOCOMMIT включен. Чтобы его отключить следует ввести команду:

    UPDATE COMMAND OPTIONS USING c OFF

Установка уровня изоляции в DB2 выполняется командой:

    CHANGE ISOLATION TO уровень_изоляции
уровень_изоляции может принимать значения: UR / CS / RS / RR

Изменение уровня изоляции может выполняться только при отсутствии соединения с базой данных. Соединение с базой данных выполняется командой:

    CONNECT TO имя базы
разрыв соединения - оператором
    CONNECT RESET

Инструментальные средства Oracle

По умолчанию в среде SQL*Plus режим AUTOCOMMIT выключен.

Установка уровня изоляции в Oracle выполняется командой:

    ALTER SESSION SET ISOLATION_LEVEL = уровень_изоляции 
уровень_изоляции может принимать значения READ COMMITTED / SERIALIZABLE

КаталогОглавлениеИндекс раздела