Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
4 курс (заочка) / Лабораторные работы / !Лабораторный практикум ТБД (задание).pdf
Скачиваний:
17
Добавлен:
08.01.2022
Размер:
1.12 Mб
Скачать

Дополнительный материал для самостоятельного изучения

Управление параллельной обработкой

Oracle поддерживает три различных уровня изоляции транзакций и вдобавок позволяет приложениям налагать блокировки явным образом. Явное наложение блокировок, однако, не рекомендуется, поскольку оно может войти в конфликт со стратегией блокировки, применяемой Oracle по умолчанию, и, кроме того, увеличивает вероятность взаимной блокировки транзакций.

Прежде чем обсуждать уровни изоляции транзакций, необходимо кратко рассмотреть то, как Oracle обрабатывает изменения в базе данных. Oracle ведет учет числа изменений в системе (System Change Number, SCN), которое представляет собой значение масштаба базы данных, увеличивающееся на единицу всякий раз, когда в базе данных производится изменение. Когда изменяется строка, текущее значение SCN сохраняется вместе со строкой. Одновременно исходный образ строки помещается в сегмент отката (rollback segment) — буфер, поддерживаемый Oracle для выполнения отката и записи транзакций в журнал. Исходный образ включает в себя значение SCN, которое было записано в строке до изменения. Завершив обновление, Oracle увеличивает SCN.

Допустим, приложение выдает SQL-оператор вида

UPDATE MYTABLE

SET

MyColumn1 = 'Новое_Значение'

WHERE

MyColumn2 = 'Что-нибудь';

Сначала записывается значение SCN, имевшее место в момент запуска оператора. Назовем это значение SCN оператора. При обработке запроса, в данном случае при поиске строк, в которых MyColumn2 = 'Что-нибудь', Oracle выберет только те строки, которые содержат завершенные изменения с SCN, меньшим или равным SCN оператора. Если Oracle находит строку с завершенным изменением, SCN которой превышает SCN оператора, она ищет в сегменте отката версию этой строки с завершенным изменением, SCN которой меньше, чем SCN оператора.

При таком способе обработки SQL-операторы всегда считывают согласованный набор значений — те значения, которые были записаны до или в

50

момент запуска оператора. Эта стратегия иногда применяется и к транзакциям. В этом случае все операторы в транзакции считывают строки, SCN которых не превышает значение SCN, имевшее место на момент начала транзакции.

Обратите внимание, что Oracle считывает только завершенные изменения. Следовательно, «грязное» чтение невозможно.

Oracle поддерживает три уровня изоляции транзакций: «завершенное чтение», «сериализуемость» и «только чтение» (read only). Первые два уровня изоляции определены в стандарте ANSI 1992 г., а уровень «только чтение» является уникальным для Oracle. В таблице приведена характеристика этих уровней изоляции.

Таблица. Варианты управления параллельной обработкой в Oracle

Уровень изоляции

Описание

 

 

Завершенное

Уровень изоляции, используемый Oracle по умолчанию.

чтение

"Грязное" чтение невозможно, но повторное чтение

 

может дать различные результаты. Возможно

 

возникновение фантомов.

 

Каждый оператор считывает согласованные данные.

 

Когда налагается блокировка на обновление операторы

Сериализуемость

«Грязное* чтение невозможно. Повторное чтение дает

 

один и тот же результат, фантомы невозможны.

 

Все операторы а транзакции считывают согласованные

 

данные. Ошибка «Cannot Serialize" («Невозможно

 

сериализовать") возникает, когда транзакция пытается

 

обновить или удалить строку с завершенным

 

изменением, которое произошло после начала

 

транзакции. Кроме того, эта ошибка возникает, когда

 

транзакции или операторы, налагающие блокировку,

 

фиксируют свои изменения, а также когда транзакция

 

откатывается вследствие взаимной блокировки.

Уровень изоляции «завершенное чтение»

При уровне изоляции «завершенное чтение» «грязное» чтение невозможно, однако чтение может быть невоспроизводимым, и могут возникать фантомы. «Завершенное чтение» — это уровень изоляции

51

транзакций, применяемый в Oracle по умолчанию, поскольку Oracle никогда не считывает несохраненные изменения.

При уровне изоляции «завершенное чтение» каждый оператор по отдельности согласован, но два различных оператора в одной и той же транзакции могут считать несогласованные данные. Это то же самое, что согласованность на уровне оператора, как она определена в предыдущей главе. Если требуется согласованность на уровне транзакции, необходимо использовать уровень «сериализуемость». Однако не смешивайте согласованность на уровне оператора с проблемой потери обновления. В Oracle потерянные обновления невозможны, так как она никогда не читает «грязные» данные.

Из-за того, как Oracle использует SCN, ей не требуется налагать блокировки при чтении. Но перед тем как изменить или удалить строку, Oracle наложит на нее монопольную блокировку. Если другая транзакция наложила монопольную блокировку на данную строку, оператор будет ждать. Если наложившая блокировку транзакция откатывается, изменение или удаление выполняется.

Если наложившая блокировку транзакция сохраняется в базе данных, то оператору передается новое значение SCN, и сам оператор (а не транзакция) откатывается и запускается заново. Когда происходит откат оператора, изменения, уже произведенные этим оператором, отменяются с помощью сегментов отката.

Вследствие использования монопольных блокировок могут возникать ситуации взаимной блокировки. Когда такое происходит, Oracle обнаруживает взаимную блокировку с помощью графа ожидания (wait-for graph) и производит откат одного из вызвавших конфликт операторов.

Уровень изоляции «сериализуемость»

При уровне изоляции «сериализуемость» «грязное» чтение невозможно, чтение всегда является воспроизводимым, и фантомы возникать не могут. Oracle поддерживает этот уровень изоляции, но для его работы необходимо участие прикладной программы.

Чтобы изменить уровень изоляции транзакции внутри самой транзакции, используйте команду Set Следующий оператор установит уровень изоляции «сериализуемостъ» на время выполнения транзакции:

52

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

Чтобы изменить уровень изоляции для всех транзакций в сессии, воспользуйтесь командой ALTER:

ALTER SESSIONS SET ISOLATION_LEVEL SERIALIZABLE:

Когда установлен уровень изоляции «сериализуемость», Oracle сохраняет значение SCN в момент запуска транзакции. Назовем это значение SCN транзакции. Пока транзакция выполняется, Oracle считывает только те зафиксированные изменения, для которых значение SCN не превышает SCN транзакции. Следовательно, чтение всегда является воспроизводимым, а фантомы невозможны.

Пока транзакция не пытается обновить или удалить какую-либо строку с завершенным изменением, SCN которой больше SCN транзакции, обработка транзакции будет идти своим чередом. Если же транзакция попытается обновить или удалить такую строку, Oracle выдаст ошибку «Cannot Serialize». Здесь должна сыграть свою роль прикладная программа. Она может зафиксировать сделанные изменения, выполнить откат всей транзакции или предпринять какое-то другое действие. Любая программа, выполняемая с уровнем изоляции «сериализуемость», должна содержать такую обработку исключений.

Кроме того, когда транзакция, выполняемая при уровне изоляции «сериализуемость», пытается обновить или удалить строку, на которую другой транзакцией или оператором наложена монопольная блокировка, транзакция ждет. Если происходит откат транзакции или оператора, наложившего блокировку, обработка транзакции может быть продолжена. Если же наложившая блокировку транзакция сохраняется, Oracle выдает ошибку «Cannot Serialize», и приложение должно обработать это исключение.

Подобным же образом, если произошел откат сериализуемой транзакции вследствие взаимной блокировки, также произойдет ошибка «Cannot Serialize».

Уровень изоляции «только чтение»

При этом уровне изоляции транзакция считывает только те строки с завершенными изменениями, для которых значение SCN меньше или равно SCN транзакции. Если транзакция обнаруживает строки с завершенными изменениями, в которых значение SCN превышает SCN транзакции, Oracle

53