Материал: !Лабораторный практикум ТБД (задание)

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

момент запуска оператора. Эта стратегия иногда применяется и к транзакциям. В этом случае все операторы в транзакции считывают строки, 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

обратится к сегментам отката и реконструирует строку в том виде, как она была до начала транзакции. На этом уровне изоляции запрещены вставка, обновление и удаление.

Дополнительные замечания о блокировках

Приложение может налагать блокировки явным образом, используя форму SELECT FOR UPDATE оператора SELECT. Это не рекомендуется делать, пока вы не узнаете о блокировках в Oracle гораздо больше, чем описано здесь.

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

Чтобы снизить вероятность конфликта блокировок, Oracle не дает возможности распространять блокировки с одного уровня на другой. Строчные блокировки остаются строчными, даже если их насчитываются сотни на сотнях строк таблицы. Эта стратегия отличается от стратегии SQL Server, как вы узнаете из следующей главы. Oracle Corporation заявляет, что нерасширение блокировок является преимуществом, и возможно, что это так, особенно если учитывать архитектуру блокировок Oracle в целом.

Oracle и безопасность

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

В Oracle имеются системные и объектные привилегии. Системные привилегии — это права на выполнение общих задач, таких как SELECT ANY TABLE и UPDATE ANY TABLE. Объектные привилегии относятся к действиям с определенными элементами базы данных — таблицами,

54

представлениями и последовательностями. Для предоставления привилегий другому пользователю можно использовать оператор GRANT.

Роль в Oracle — это совокупность привилегий и других ролей. Одна и та же роль может быть присвоена многим пользователям, и один и тот же пользователь может иметь множество ролей. Примером роли в базе данных галереи View Ridge может служить MANAGER. Эта роль наделяется всеми системными и объектными привилегиями, необходимыми для выполнения менеджерских функций в галерее. Учетные записи пользователя с данной ролью присваиваются ряду сотрудников галереи View Ridge.

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

55

Источник: https://studfile.net/preview/16527141/