- •Алгоритмы совместного доступа к базам данных
- •Конкуренция, параллельность и согласованность
- •Алгоритмы Oracle, обеспечивающие параллельность и согласованность
- •Транзакции и взаимовлияние
- •Потери изменений
- •Черновое чтение
- •Повторяемое и неповторяемое чтение
- •Уровни изоляции
- •Isolation level read committed;
- •Алгоритмы блокирования Oracle
- •Автоматическое и явное блокирование
- •Уровни блокировок
- •Разделяемые блокировки
- •Исключающие блокировки
- •Блокировки dml
- •Строчные блокировки
- •Табличные блокировки
- •In exclusive mode
- •Повышение блокировок
- •Запросы и блокирование
- •Блокировки ddl
- •Исключающие блокировки ddl
- •Разделяемые блокировки ddl
- •Блокировки синтаксического анализа
- •Внутренние фиксаторы
- •Многовариантность
- •Системный номер изменения
- •Неблокирующие запросы
- •Многовариантность и согласованность чтения на уровне транзакций
- •Ошибки "слишком старый моментальный снимок"
- •Автоматическое функционирование системы
Isolation level read committed;
... другие операторы транзакции ...
COMMIT;
Кроме того, алгоритм многовариантности, рассматриваемый позже в этой части, предлагает некоторые уникальные варианты изоляции, которые не входят в стандарт SQL.
Алгоритмы блокирования Oracle
Для того чтобы предотвратить отрицательное воздействие одних транзакций на другие, Oracleблокирует различные ресурсы базы данных во время обработки информации. Точно так же, как дверной замок не позволяет войти в ваш дом в ваше отсутствие, так и блокировка (lock) ресурса базы данных не разрешает посторонним воспользоваться этим ресурсом и мешать вашей работе. Далее будет рассказано, как блокируются ресурсы базы данныхOracle, чтобы не допустить вмешательства в систему.
Автоматическое и явное блокирование
По умолчанию во время выполнения операции транзакция устанавливает все необходимые блокировки ресурсов системы. Предположим, что пользователь начинает новую транзакцию и обновляет адрес клиента. Перед обновлением указанной строки Oracleпроверяет, не блокируют ли эту строку другие открытые транзакции этой строки. Если строка блокирована, то новая транзакция ожидает окончания транзакции, удерживающей блокировку, и снятия блокировки строки. Если же строка не блокирована,Oracleавтоматически устанавливает блокировку строки для новой транзакции. Эта транзакция будет блокировать строку до тех пор, пока не завершится или не будет выполнен ее откат, причем другие транзакции не смогут модифицировать строку и привести к потере изменения.
Для большинства приложений вполне приемлемы алгоритмы блокирования Oracle, устанавливаемые по умолчанию. Однако иногда транзакции выполняются быстрее, если они явно блокируют данные, предвидя, какая операция будет выполнена над базой данных. Представим себе создание транзакции, которая должна будет обновлять большую часть строк таблицы. Если таблица достаточно велика, намного целесообразнее перед обновлением информации заблокировать всю таблицу, а не позволятьOracleприменять алгоритмы блокирования по умолчанию, устанавливающие строчные блокировки по мере обновления каждой строки таблицы. Кроме того, формирование табличной блокировки в начале транзакции гарантирует выполнение всей операции целиком. Например, если во время выполнения оператораUPDATE, примененного ко всем строкам таблицы,Oracleобновит почти все строки таблицы, а затем встретит заблокированную строку, может понадобиться откат обновления всех предыдущих строк. Более подробно о различных уровнях блокировок, например о блокировках уровня строки и уровня таблицы, будет рассказано в следующих разделах.
Уровни блокировок
Oracleблокирует ресурсы базы данных в одном издвухрежимов: разделяемом или исключающем. Общее представление о разделяемых и исключающих блокировках дано на рис. 1 и в последующих разделах.
Транзакция
1 Разделяемая
блокировка
Исключающая
блокировка
Исключающая
блокировка Транзакция
2 Разделяемая
блокировка
Исключающая
блокировка
Исключающая
блокировка Таблица
Строка #1
Строка #2
Строка #3
Строка #4
Строка #5
Строка #6
Строка
#7
Рис. 1. Разделяемые и исключающие блокировки обеспечивают большую или меньшую параллельность выполнения различных операций.