
- •Алгоритмы совместного доступа к базам данных
- •Конкуренция, параллельность и согласованность
- •Алгоритмы Oracle, обеспечивающие параллельность и согласованность
- •Транзакции и взаимовлияние
- •Потери изменений
- •Черновое чтение
- •Повторяемое и неповторяемое чтение
- •Уровни изоляции
- •Isolation level read committed;
- •Алгоритмы блокирования Oracle
- •Автоматическое и явное блокирование
- •Уровни блокировок
- •Разделяемые блокировки
- •Исключающие блокировки
- •Блокировки dml
- •Строчные блокировки
- •Табличные блокировки
- •In exclusive mode
- •Повышение блокировок
- •Запросы и блокирование
- •Блокировки ddl
- •Исключающие блокировки ddl
- •Разделяемые блокировки ddl
- •Блокировки синтаксического анализа
- •Внутренние фиксаторы
- •Многовариантность
- •Системный номер изменения
- •Неблокирующие запросы
- •Многовариантность и согласованность чтения на уровне транзакций
- •Ошибки "слишком старый моментальный снимок"
- •Автоматическое функционирование системы
Уровни изоляции
Для того чтобы обеспечить предсказуемость функционирования различных приложений, работающих в многопользовательских системах баз данных, стандарт ANSI/ISOдляSQLустанавливает различные уровни изоляции для операций, выполняемых над базами данных. Уровень изоляции(isolation level)транзакции определяет, могут ли операторы транзакции видеть результаты других одновременно выполняемых незавершенных и/или завершенных транзакций. Например, если выполнить в транзакции один и тот же запрос дважды, то уровень изоляции определит, будет ли в результате выполнения каждого запроса возвращаться одинаковое результирующее множество данных и стоит ли игнорировать результаты других незавершенных и/или завершенных транзакций. В таблице 1 показано, как одна из транзакций может влиять на корректность результатов выполнения другой в многопользовательской среде.
Таблица 1. Уровни изоляции точно устанавливают способ воздействия параллельных транзакций друг на друга в многопользовательской среде
Транзакция 1 |
Транзакция 2 |
SELЕСТ * FROM sales.orders; ID CUST_ID ORDER_DATE SHIP_DATE PAID_DATE S -- ------- ---------- --------- --------- - 1 1 21 OCT 97 F |
|
|
INSERT INTO sales.orders VALUES (2,8,SYSDATE,NULL,NULL,'F’); |
SELЕСТ * FROM sales.orders; ID CUST_ID ORDER_DATE SHIP_DATE PAID_DATE S -- ------- ---------- --------- --------- - 1 1 21 OCT 97 F 2 8 21 OCT 97 F |
|
. . . |
. . . |
В таблице 1 транзакция 1 видит результаты транзакции 2, хотя транзакция 2 еще не завершена. Точнее говоря, во время второго выполнения запроса транзакции 1 виден фантом, введенный транзакцией 2.
Каждый уровень изоляции позволяет параллельным транзакциям в большей или меньшей мере влиять друг на друга. При использовании различных уровней изоляции нужно соблюдать баланс между параллельностью работы и производительностью системы. Например, когда уровень изоляции допускает достаточно высокую степень взаимовлияния транзакций, их одновременное выполнение ведет к повышению параллельности и производительности. И наоборот, когда уровень изоляции устанавливает невысокую степень взаимовлияния, одновременное выполнение транзакций ведет к снижению параллельности, и одна из них, скорее всего, будет ждать, пока не закончится другая. Различные степени взаимовлияния, допускаемые каждым уровнем изоляции, представлены в таблице 2.
Таблица 2. Уровни изоляции ANSI/ISOопределяют, в какой степени параллельные транзакции будут влиять друг на друга в многопользовательской системе баз данных
Уровень изоляции |
Черновое чтение |
Неповторяемое чтение |
Фантомы |
Read Uncommitted (чтение незавершенных транзакций) |
٧ |
٧ |
٧ |
Read Committed (чтение завершенных транзакций) |
x |
٧ |
٧ |
Repeatable Read (повторяемое чтение) |
x |
х |
٧ |
Serializable (последовательное чтение) |
x |
x |
х |
По умолчанию при выполнении транзакций используется уровень изоляции ReadCommitted(чтение завершенных транзакций). При необходимости можно начать выполнение транзакции, явно указав уровень изоляцииSerializable(последовательное чтение).
-- начало транзакции с уровнем изоляции Serializable
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
... другие операторы транзакции ...
COMMIT;
-- начало транзакции с уровнем изоляции Read Committed
SET TRANSACTION