- •Алгоритмы совместного доступа к базам данных
- •Конкуренция, параллельность и согласованность
- •Алгоритмы Oracle, обеспечивающие параллельность и согласованность
- •Транзакции и взаимовлияние
- •Потери изменений
- •Черновое чтение
- •Повторяемое и неповторяемое чтение
- •Уровни изоляции
- •Isolation level read committed;
- •Алгоритмы блокирования Oracle
- •Автоматическое и явное блокирование
- •Уровни блокировок
- •Разделяемые блокировки
- •Исключающие блокировки
- •Блокировки dml
- •Строчные блокировки
- •Табличные блокировки
- •In exclusive mode
- •Повышение блокировок
- •Запросы и блокирование
- •Блокировки ddl
- •Исключающие блокировки ddl
- •Разделяемые блокировки ddl
- •Блокировки синтаксического анализа
- •Внутренние фиксаторы
- •Многовариантность
- •Системный номер изменения
- •Неблокирующие запросы
- •Многовариантность и согласованность чтения на уровне транзакций
- •Ошибки "слишком старый моментальный снимок"
- •Автоматическое функционирование системы
Повышение блокировок
Повышение блокировок (lock escalation) —это метод, применяемый на многих серверах баз данных для снижения расхода ресурсов системы на блокирование данных. Для примера рассмотрим сервер базы данных, блокирующий табличные данные на уровне строк. После того как транзакция устанавливает определенное число строчных блокировок для таблицы, сервер может преобразовать несколько блокировок на уровне строк в одну блокировку табличного уровня. Это позволяет сэкономить ресурсы системы, необходимые для блокирования данных таблицы.
На первый взгляд может показаться, что повышение блокировок весьма удобно и способствует более рациональному использованию ресурсов системы. Однако повышение блокировок может стать причиной взаимоблокировок. В Oracleповышение блокировок не применяется, и тупики обычно возникают из-за плохой структуры транзакций.
Запросы и блокирование
В предыдущих разделах этой части не упоминались типы блокировок, которые устанавливаются, если транзакция обращается к таблице с запросом. Дело в том, что Oracleне блокирует строки или таблицы при считывании данных во время запроса. Однако для согласованности чтения данных во время запроса без блокирования вOracleиспользуется уникальный алгоритм многовариантности, выполняющий повторяемое чтение данных. Более подробно об алгоритме многовариантностиOracleрассказано ниже в разделе "Многовариантность".
Блокировки ddl
Выше было рассказано о блокировках, автоматически используемых в Oracleдля защиты операцийDML:INSERT,UPDATEиDELETE. Кроме того, вOracleданные блокируются автоматически при выполнении таких операцийDDL, какCREATE,ALTERиDROP. Далее будет рассказано, в каких случаях устанавливаются разделяемые и исключающие блокировкиDULобъектов базы данных.
Каждая операция DDLвыполняется внутри своей транзакции. Поэтому транзакция устанавливает и удерживает необходимые блокировкиDDLтолько во время выполнения собственно операцииDDL.
Исключающие блокировки ddl
Для выполнения операторов DDL, создающих, изменяющих и удаляющих объекты базы данных, требуются исключающие блокировкиDDL(exclusive DDL locks)соответствующих объектов. Например, при выполнении оператораALTERTABLE, если к таблице добавляется новое ограничение целостности, транзакция устанавливает исключающую блокировкуDDLэтой таблицы. При этом другие пользователи не могут модифицировать или удалить таблицу до тех пор, пока операторALTERне будет выполнен.
Разделяемые блокировки ddl
При выполнении некоторых операторов DDLмогут устанавливаться разделяемые блокировкиDDLобъектов базы данных. Такие блокировки обычно нужны операторамDDL, с помощью которых между объектами базы данных устанавливаются различные взаимосвязи. Предположим, например, что создается новый модуль, при этом процедуры и функциимодуля ссылаются на множество различных таблиц базы данных. При создании модуля транзакция устанавливает исключающую блокировкуDDLмодуля и разделяемую блокировкуDDLтаблиц, на которые происходит ссылка. Разделяемые блокировкиDDLне позволяют другим транзакциям устанавливать исключающие блокировки этих таблиц для их изменения или удаления до тех пор, пока не закончится компиляция модуля. Однако разделяемые блокировки не устраняют возможности того, что другие транзакции также установят разделяемые блокировкиDDLтаблиц, на которые производится ссылка, например, для создания хранимых процедур, использующих эти таблицы.