Свойство параллельности является одним из наиболее важных свойств транзакций, которые обеспечивают промышленные базы данных. Современные промышленные СУБД обеспечивают параллельную работу с одними и теми же данными огромного количества пользователей. Так, СУБД DB2 была протестирована при одновременной работе 60 тыс. пользователей; точных данных по Oracle у нас нет, но и здесь речь идет о десятках тысяч пользователей. В таких условиях важно, чтобы параллельно выполняемые транзакции не накладывались, а были изолированы друг от друга.
Стандарт SQL/92 определяет уровни изоляции транзакций в многопользовательской системе через отсутствие таких аномалий доступа к базе данных, которые могут в конечном итоге угрожать целостности данных. В стандарте различаются следующие аномалии:- Потерянные изменения. Транзакция Т1 читает данные. Транзакция Т2 читает те же данные. Транзакция T1 на основании прочитанного значения вычисляет новое значение данных, записывает его в базу данных и завершается. Транзакция T2 на основании прочитанного значения вычисляет новое значение данных, записывает его в базу данных и завершается. В результате значение, записанное транзакцией Т2, "затрет" значение, записанное транзакцией Т1.
- Грязное чтение. Транзакция Т1 изменяет некоторые данные, но еще не завершается. Транзакция Т2 читает эти же данные (с изменениями, внесенными транзакцией Т1) и принимает на их основе какие-то решения. Транзакция Т1 выполняет откат. В результате решение, принятое транзакцией Т2, основано на неверных данных.
- Неповторяющееся чтение. Транзакция Т1 в ходе своего выполнения несколько раз читает одни и те же данные. Транзакция Т2 в интервалах между чтениями данных в транзакции Т1 изменяет эти данные и фиксируется. В результате оказывается, что чтения одних и тех же данных в транзакции Т1 дают разные результаты.
- Фантом. Транзакция Т1 в ходе своего выполнения несколько раз выбирает множество строк по одним и тем же критериям. Транзакция Т2 в интервалах между выборками транзакции Т1 добавляет или удаляет строки или изменяет столбцы некоторых строк, используемых в критерии выборки, и фиксируется. В результате оказывается, что одинаковые запросы в транзакции Т1 выбирают разные множество строк.
Определение уровней изоляции в стандарте и в рассматриваемых нами СУБД сведено в таблицу:
Уровни изоляции SQL/92 | Аномалии | DB2 | Oracle | |||
А1 | А2 | А3 | А4 | |||
READ UNCOMMITTED | нет | да | да | да | UNCOMMITTED READ (UR) | - |
READ COMMITTED | нет | нет | да | да | CURSOR STABILITY (CS) | READ COMMITTED |
REPEATABLE READ | нет | нет | нет | да | READ STABILITY (RS) | - |
SERIALIZABLE | нет | нет | нет | нет | REPEATABLE READ (RR) | SERIALIZABLE |
Аномалии: А1 - Потерянные изменения А3 - Неповторяющееся чтение А2 - Грязное чтение А4 - Фантом |
READ ONLY
- для только-читающих транзакций.В Oracle требуемый уровень изоляции может быть установлен для сеанса соединения с базой данных - как одна из возможностей оператора
ALTER SESSION
или для отдельной транзакции оператором SET TRANSACTION
. Синтаксис этих операторов показан на рис. 5.4.

Рисунок 5.4 - Операторы
ALTER SESSION
и SET TRANSACTION
(Oracle)CHANGE ISOLATION
:
Рисунок 5.5 - Операторы
CHANGE ISOLATION
(DB2)
Немає коментарів:
Дописати коментар