- •Алгоритмы совместного доступа к базам данных
- •Конкуренция, параллельность и согласованность
- •Алгоритмы Oracle, обеспечивающие параллельность и согласованность
- •Транзакции и взаимовлияние
- •Потери изменений
- •Черновое чтение
- •Повторяемое и неповторяемое чтение
- •Уровни изоляции
- •Isolation level read committed;
- •Алгоритмы блокирования Oracle
- •Автоматическое и явное блокирование
- •Уровни блокировок
- •Разделяемые блокировки
- •Исключающие блокировки
- •Блокировки dml
- •Строчные блокировки
- •Табличные блокировки
- •In exclusive mode
- •Повышение блокировок
- •Запросы и блокирование
- •Блокировки ddl
- •Исключающие блокировки ddl
- •Разделяемые блокировки ddl
- •Блокировки синтаксического анализа
- •Внутренние фиксаторы
- •Многовариантность
- •Системный номер изменения
- •Неблокирующие запросы
- •Многовариантность и согласованность чтения на уровне транзакций
- •Ошибки "слишком старый моментальный снимок"
- •Автоматическое функционирование системы
Системный номер изменения
Каждая завершенная транзакция увеличивает системный номер изменения (SCN - system change number). В нашем случае можно считать SCN уникальным идентификатором завершенной транзакции. В заголовок блока данных записывается SCN воздействовавшей на этот блок транзакции, которая завершилась последней. После формирования запросаOracleсоздает для результирующего множества запроса набор согласованных данных с помощью нижеприведенных операций:
В начале запроса Oracleанализирует текущий SCN системы. Для простоты будем называть его SCN запроса (querySCN).'
При выполнении запроса Oracleсчитывает блоки данных и создает из них результирующее множество запроса. Считывая каждый блок данных,Oracleсравнивает SCN запроса с SCN, находящимся в заголовке блока данных:
Если SCN в блоке данных равен SCN запроса или меньше его, Oracleможет использовать данные этого блока для построения результирующего множества запроса.
Если SCNв блоке данных большеSCNзапроса,Oracleсчитывает информацию из сегментов отката системы, чтобы воссоздать информацию блока данных в том виде, в котором она находилась в момент, соответствующий SCN запроса.
На рис. 3 показано, как алгоритм многовариантности используется для возвращения набора данных, которые согласованы с SCN, существующим в момент начала запроса.
SELECT…
Блоки
с SCN, который равен или
меньшеSCNзапроса
Сегмент
отката
Блоки
с SCN, который большеSCNзапроса
Блоки
с SCN, равнымSCNзапроса, воссозданные из сегмента
отката
Результирующее
множество запроса; все строки согласованы
с SCNзапроса
Рис. 3. Чтобы создать согласованный набор данных для любого SQL-оператора,Oracleможет использовать информацию, содержащуюся в сегментах отката.
Стратегия многовариантности, кроме Oracle, применяется лишь в немногих системах баз данных. Для получения того же результата (выдачи согласованного набора данных для каждого SQL-оператора) другие системы блокируют данные, однако при этом параллельность транзакций намного ниже. Если не применяются ни многовариантность, ни блокирование данных, то система базы данных может возвращать несогласованные результирующие множества.
Неблокирующие запросы
Когда для создания согласованного результирующего множества для каждого SQL-оператора вместо блокировок применяются сегменты отката системы, запросы являются неблокирующими (non-blocking). Как следствие,Oracleобеспечивает чрезвычайно высокую степень параллельности даже в средах со смешанными транзакциями, где транзакции записи и транзакции чтения работают с одними и теми же наборами данных. Одновременно с одним набором может работать сколь угодно большое количество читающих транзакций и одна записывающая.
Многовариантность и согласованность чтения на уровне транзакций
Выше обсуждалось, как алгоритм многовариантности Oracleможет создавать согласованные результирующие множества для отдельных операторов. Кроме того, этот алгоритм используется вOracleдля построения результирующих множеств для всех запросов транзакций, имеющих тип "только для чтения". После старта такой транзакции все последующие запросы транзакции видят информацию базы данных такой, какой она была в момент начала транзакции. Приложения по созданию отчетов часто используют явные транзакции "только для чтения", чтобы объединить несколько запросов и выдать отчет, содержащий согласованные данные.
В этом случае при необходимости Oracleвновь использует сегменты отката системы для воссоздания старых вариантов блоков данных. Если транзакция "только для чтения" выполняется в базе данных, информация которой часто обновляется,Oracleдля создания варианта базы данных, требуемого для транзакции, приходится использовать все больший и больший объем информации, содержащейся в сегментах отката.
Чтобы начать транзакцию "только для чтения" и обеспечить чтение согласованных данных для всех последующих запросов транзакции, первым оператором транзакции должен быть оператор SETTRANSACTION:
SET TRANSACTION READ ONLY;