| Каталог | Оглавление | Индекс раздела |
Стандарт 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 | |
| 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 |
| Шаг | Транзакция 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 транзакции должны взаимно заблокироваться. |
Для выполнения сценариев проверки изолированности следует запустить два сеанса интерактивного 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
По умолчанию в среде SQL*Plus режим AUTOCOMMIT выключен.
Установка уровня изоляции в Oracle выполняется командой:
ALTER SESSION SET ISOLATION_LEVEL = уровень_изоляции
уровень_изоляции может принимать значения READ COMMITTED / SERIALIZABLE
| Каталог | Оглавление | Индекс раздела |