Программирование >>  Oracle 

1 ... 42 43 44 [ 45 ] 46 47 48 ... 469


tkyte@TKYTE816> select

(select username from v$session where sid=a.sid) blocker,

2 a.sid,

3 is blocking ,

4 (select username lr>m v$session where sid=b.sid) blоскее,

5 b.sid

6 from v$lock a, v$lock b

7 where a.block = 1

8 and b.request > 0

9 and a.idl = b.idl

10 and a.id2 = b.id2

11 /

BLOCKER

ISBLOCKING

BLOCKEE

TKYTE

8 is blocking TKYTE

Теперь, если зафиксировать исходную транзакцию в сеансе SID = 8 и выполнить запрос повторно, окажется, что строка запроса блокировки исчезла:

tkyte@TKYTE816> select username,

2 v$lock.sid,

3 trunc(id1/power(2,16))

4 bitand(id1,power(2,16)-1)+0

5 id2 seq,

6 lmode,

7 request, block

8 from v$lock, v$session

9 where v$lock.type = TX

10 and v$lock.aid = v$session.sid

11 and v$session. username = USER

12 /

rbs.

slot.

USERNAME

SLOT

LMODE

REQUEST

TKYTE 9 3

tkyte@TKYTE816> select XIDUSN,

2 from v$transaction

XIDSLOT,

XIDSQN

XIDUSN XIDSLOT

XIDSQN

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

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

Напоследок необходимо разобраться еще в одном: как хранится информация о блокировках и транзакциях в самих данных. Она является частью служебной информации блока. В главе 2 было описано, что базовый формат предусматривает в начале блока



системное пространство для хранения таблицы транзакций для этого блока. Такая таблица транзакций включает записи для каждой реальной транзакции, заблокировавшей те или иные данные в этом блоке. Размер этой структуры управляется двумя атрибутами хранения, задаваемыми в операторе CREATE при создании объекта:

INITRANS - первоначальный, заранее заданный размер этой структуры. Стандартное значение: 2 - для индексов и 1 - для таблиц.

MAXTRANS - максимальный размер, до которого может разрастаться эта структура. Стандартное значение: 255.

Итак, каждый блок начинает стандартно свое существование с одним или двумя слотами для транзакций. Количество активных транзакций, которые могут одновременно работать с блоком, ограничивается значением MAXTRANS и доступностью пространства в блоке. Невозможно достичь 255 одновременных транзакций в блоке, если там нет места для роста данной структуры.

Можно искусственно продемонстрировать, как это происходит, создав таблицу с ограниченным значением MAXTRANS. Например:

tkyte@TKYTE816> create table t (x int) maxtrans 1; Table created.

tkyte@TKYTE816> insert into t values (1) ;

1 row created.

tkyte@TKYTE816> insert into t values (2) ; 1 row created.

tkyte@TKYTE816> commit; Commit complete.

Теперь в одном сеансе выполняем:

tkyte@TKYTE816> update t set x - 3 where x = 1; 1 row updated.

а в другом:

tkyte@TKYTE816> update t set x = 4 where x = 2;

Поскольку обе строки находятся в одном и том же блоке и параметру MAXTRANS (максимальная степень одновременности доступа для данного блока) установлено значение 1, второй сеанс будет заблокирован. Это демонстрирует, что происходит, когда транзакции в количестве, превышающем значение параметра MAXTRANS, пытаются одновременно обратиться к одному и тому же блоку. Точно так же происходит блокирование, если параметр INITRANS имеет небольшое значение и в блоке нет места для динамического добавления транзакции. В большинстве случаев стандартные значения 1 и 2 для параметра INITRANS приемлемы, поскольку таблица транзакций будет динамически расти (в пределах имеющегося свободного пространства), но в некоторых средах для повышения параллелизма и уменьшения количества ожидающих сеансов это значение придется увеличить. В качестве примера можно привести таблицу или, ско-



ТМ - блокировки очередности ЯМД

Такие блокировки позволяют быть уверенным, что структура таблицы не изменится при изменении ее содержимого. Рассмотрим такой пример. При изменении таблицы на нее устанавливается блокировка ТМ; это предотвращает применение к ней операторов DROP или ALTER другим сеансом. Если сеанс пытается применить оператор ЯОД к таблице, на которую другой сеанс установил блокировку, он получит следующее сообщение об ошибке:

drop table dept ERI GR at line 1:

ORA-00054: resource busy and acquire with NOWAIT specified

Это сообщение поначалу сбивает с толку, поскольку нет никакого способа задать конструкции NOWAIT или WAIT в операторе DROP TABLE. Это просто сообщение общего вида, которое сеанс получает, пытаясь выполнить операцию, которая будет заблокирована, хотя не допускает блокирования. Как мы уже видели, такое же сообщение отображается при попытке применить оператор SELECT FOR UPDATE NOWAIT к заблокированной строке.

Ниже показано, как эти блокировки будут отражены в таблице V$LOCK:

tkyte@TKYTE816> create table tl (x int) ; Table created.

tkyte@TKYTE816> create table t2 (x int) ; Tale created.

tkyte@TKYTE816> insert into tl values (1); 1 row created.

tkyte@TKYTE816> insert into t2 values (1);

1 row created.

tkyte@TKYTE816> select username,

2 v$lock.sid,

3 id1, id2,

4 lmode,

5 request, block, v$lock.type

6 from v$lock, v$session

7 where v$lock.sid = v$session.sid

8 and v$session.usemame = USER

рее, индекс (поскольку в блоках индекса может храниться намного больше строк, чем в обычном блоке таблицы), который часто изменяется. Может понадобиться увеличить значение INITRANS, чтобы заранее зарезервировать достаточно места в блоке для предполагаемого количества одновременных транзакций. Это особенно необходимо, если предполагается заполнение блоков практически целиком и может не остаться места для динамического расширения таблицы транзакций в блоке.



1 ... 42 43 44 [ 45 ] 46 47 48 ... 469

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика