|
Программирование >> Oracle
USERNAME TKYTE TKYTE TKYTE
tkyte@TKYTE816> select object name, object id from user objects; OBJECT NAME OBJECT ID Tl 24054 T2 24055 Хотя для каждой транзакции может быть только одна блокировка ТХ, можно устанавливать столько блокировок ТМ, сколько объектов изменяется. В этом случае значение столбца ID1 для блокировки ТМ представляет собой идентификатор объекта, заблокированного оператором ЯМД, так что найти блокируемый объект легко. Интересная особенность блокировки ТМ: общее количество блокировок ТМ, поддерживаемых в системе, конфигурируется администратором (подробнее см. описание параметра DML LOCKS файла init.ora в руководстве Oracle8i Server Reference). Его можно даже установить равным нулю. Это не означает, что база данных становится доступной только для чтения (так как блокировки не поддерживаются), - в ней не разрешены операторы ЯОД. Это используется, например, в сервере OPS для упрощения координации экземпляров. Можно также лишить возможности получать блокировки ТМ для отдель-н1х объектов с помощью оператора ALTER TABLE имя таблии1 DISABLE TABLE LOCK. Блокировки ЯОД Блокировки ЯОД автоматически устанавливаются на объекты в ходе выполнения операторов ЯОД для защиты их от изменения другими сеансами. Например, при выполнении оператора ЯОД ALTER TABLE Т на таблицу Т будет установлена исключительная блокировка ЯОД, что предотвращает установку блокировок ЯОД и ТМ на эту таблицу другими сеансами. Блокировки ЯОД удерживаются на период выполнения оператора ЯОД и снимаются сразу по его завершении. Это делается путем помещения операторов ЯОД в неявные пары операторов фиксации (или фиксации и отката). Вот почему операторы ЯОД в Oracle всегда фиксируются. Операторы CREATE, ALTER и т.д. фактически выполняются, как показано в следующем псевдокоде: Begin Commit; Оператор ЯОД Commit; Exception When others then rollback; End; Поэтому операторы ЯОД всегда фиксируют транзакцию, даже если завершаются неудачно. Выполнение оператора ЯОД начинается с фиксации. Помните об этом. Сна- чала выполняется фиксация, чтобы в случае отката не пришлось откатывать предыдущую часть транзакции. При выполнении оператора ЯОД фиксируются все выполненные ранее изменения, даже если сам оператор ЯОД выполнен неудачно. Если должен быть выполнен оператор ЯОД, но не требуется, чтобы он зафиксировал существующую транзакцию, можно использовать автономную транзакцию (подробнее см. в главе 15). Имеется три типа блокировок ЯОД: Исключигельн1е блокировки ЯОД. Они предотвращают установку блокировок ЯОД или ТМ (ЯМД) другими сеансами. Это означает, что можно запрашивать таблицу в ходе выполнения оператора ЯОД, но нельзя ее изменять. Разделяем1е блокировки ЯОД. Они защищают структуру соответствующего объекта от изменения другими сеансами, но разрешают изменять данные. Нарушаем1е блокировки разбора (breakable parse locks). Они позволяют объекту, например плану запроса, хранящемуся в кэше разделяемого пула, зарегистрировать свою зависимость от другого объекта. При выполнении оператора ЯОД, затрагивающего заблокированный таким образом объект, сервер Oracle получает список объектов, зарегистрировавших свою зависимость, и помечает их как недействительные. Вот почему эти блокировки - нарушаемые : они не предотвращают выполнение операторов ЯОД. Большинство операторов ЯОД устанавливает исключительную блокировку ЯОД. При выполнении оператора, подобного Alter table t add new column date; таблица Т будет недоступна для изменения, пока оператор выполняется. К таблице в этот период можно обращаться с помощью оператора SELECT, но другие действия, в том числе операторы ЯОД, блокируются. В Oracle 8i некоторые операторы ЯОД теперь могут выполняться без установки блокировок ЯОД. Например, можно выполнить: create index t idx on t(x) ONLINE; Ключевое слово ONLINE изменяет метод построения индекса. Вместо установки исключительной блокировки ЯОД, предотвращающей изменения данных, Oracle попытается установить на таблицу низкоуровневую (режим 2) блокировку ТМ. Это предотвращает изменения структуры с помощью операторов ЯОД, но позволяет нормально выполнять операторы ЯМД. Сервер Oracle достигает этого путем записи в таблице изменений, сделанных в ходе выполнения оператора ЯОД, и учитывает эти изменения в новом индексе, когда завершается его создание. Это существенно увеличивает доступность данных. Другие типы операторов ЯОД устанавливают разделяемые блокировки ЯОД. Они устанавливаются на объекты, от которых зависят скомпилированные хранимые объекты, типы процедур и представлений. Например, если выполняется оператор: Create view MyView as select * from emp, dept where emp. deptno = dept.deptno; разделяемые блокировки ЯОД будут устанавливаться на таблицы ЕМР и DEPT на все время выполнения оператора CREATE VIEW. Мы можем изменять содержимое этих таблиц, но не их структуру. Последний тип блокировок ЯОД - нарушаемые блокировки разбора. Когда сеанс разбирает оператор, блокировка разбора устанавливается на каждый объект, упоминаемый в этом операторе. Эти блокировки устанавливаются, чтобы разобранный и помещенный в кэш оператор был признан недействительным (и выброшен из кэша в разделяемой памяти), если один из упоминаемых в нем объектов удален или изменена его структура. При поиске этой информации особо ценным будет представление DBA DDL LOCKS. (Ни одного походящего для этого представления V$ не существует). Представление DBA DDL LOCKS строится по более мистическим таблицам Х$ и по умолчанию не создается в базе данных. Для установки его и других представлений, связанных с блокировками, выполните сценарий CATBLOCK.SQL из каталога [ORACLE HOME]/ rdbms/admin. Этот сценарий можно успешно выполнить от имени пользователя SYS. После выполнения этого сценария можно выполнять запросы к указанному представлению. Например, в базе данных с одним пользователем я получил такой результат: from dba ddl locks; mode mode tkyte@TKYTE816> select session id OWNE RNAME TYPE held reqe 8 SYS DBMS APPLICATION INFO 8 SYS DBMS APPLICATION INFO 8 SYS DBMS OUTPOT 8 SYS DBMS OUTPUT 8 TKYTE TKYTE 8 SYS DATABASE rows selected. Body Table/Procedure/Type Table/Procedure/Type Body 18 18 Null None Null None Null None Null None Null None Null None Вот и все объекты, блокируемые моим сеансом. Установлены нарушаемые блокировки разбора на два пакета DBMS *. Это - побочный эффект использования утилиты SQL*Plus; она, например, вызывает пакет DBMS APPLICATION INFO. В результатах может оказаться несколько строк для одного и того же объекта - это нормально и означает, что в разделяемом пуле сеанс использует несколько объектов, ссылающихся на данный объект. Интересно отметить, что в столбце OWNER этого представления указан не владелец блокировки, а владелец блокируемого объекта. Вот почему в нескольких строках указан пользователь SYS: он владеет этими пакетами, но блокирует их мой сеанс. Чтобы понять, как действует нарушаемая блокировка, создадим и выполним хранимую процедуру Р: tkyte@TKYTE816> create or replace procedure p as begin null; Procedure created. end; tkyte@TKYTE816> exec p PL/SQL procedure successfully completed.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |