Структура ITL (Interested Transaction List)

dbstalker, 20 октября

В oracle нет менеджера блокировок, блокировки управляются на уровне блока данных. То есть каждый блок отвечает за обеспечение блокировки записей в нем находящихся. Как блок дает право на блокировку записи? Где находятся замки на записи блока? Для этого создана структура, называемая ITL (Interested Transaction List). Находится эта структура в заголовке каждого (data/index) оракловского блока. По умолчанию ITL- таблица состоит из двух слотов. Количество слотов растет по мере необходимости (распределении ITL см. ниже). Слот обновляется для каждого изменения блока текущей транзакцией.

Как можно «пощупать» ITL?

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

В результате в файле трассировки можно обнаружить вот такую картину:

 Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   0x0016.00c.0001704c  0x00a4ed50.2681.18  --U-    1  fsc 0x0000.a2431efb
0x02   0x001a.024.0000d9fe  0x00a46662.32bf.27  C---    0  scn 0x000b.a242730d

Видно, что есть два слота. В каждом слоте содержится:

XID- уникальный идентификатор транзакции ( до момента фиксации), указатель на слот транзакционной таблицы сегмента отмены: Undoseg#.slot#.wrap

Undoseg# - это идентификатор сегмента отмены

slot# - слот в таблице транзакций заголовка сегмента отмены

wrap - количество перезаписей слота транзакциями

UBA - указатель на хвост undo-цепочки блоков (undodatablockaddr.sequence#.record#). Его также можно увидеть в представлении V$TRANSACTION : UBAFIL, UBABLK - file and block number; UBASQN - sequence number; UBAREC - record number

Lck Flag

---- транзакция активна

---T транзакция все еще активна в блоке cleanout SCN

C--- транзакция завершена, блокировки освобождены и commit SCN скопирован

-B-- эта undo запись содержит undo для этого ITL entry

--U- транзакция завершена, скопированный SCN является, скорее всего, «upper bound», а

не commit SCN. Заметьте, что флаг U в ITL также устанавливаться для fast

commit,но в этом случае присутствуют блокировок уровня записи (Lck).

Lck

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

SCN or freespace credit

Если транзакция очищена, это - commit SCN или «upper bound». При быстрой очистке - это commit SCN, но называется fsc. В противном случае ведущие два байта содержат free space credit транзакции - то есть, количество байтов освобожденных в блоке транзакцией.

«Upper bound» При отложенной очистке блока (Delayed Block Cleanout), если в таблице транзакций заголовка сегмента не найдена нужная транзакция, для ITL блока выбирается такой SCN, который наиболее подходит этой транзакции. Upper bound – верхняя граница, до которой транзакция уже наверняка была завершена. В этом случае, ITL -слот блока данных помечается флагом - flag U.

Алгоритм распределения слотов ITL

  1. находится неиспользуемый слот ITL. Если нашли - переходим к 6, иначе к 2
  2. находим слот ITL, соответствующий самой старой завершенной транзакцией, проверяем флаги и SCN. Если в ходе очистки блока их обновлять не нужно, то переходим к 6, в противном случае - идем на 3.
  3. Делаем очистку блока. Если успешно идем на 1, в противном случае - на 4.
  4. Расширяем область ITL. Если успешно – идем на 6, в противном случае - на 5.
  5. Выбираем слот ITL и ждем завершения соответствующей транзакции. Если успешно - на 3, в противном случае - на 1.
  6. слот ITL найден и распределен для текущей транзакции.

 

Новый комментарий

Я не спамер: введите суму 1+8



 

От авторов блога

О Блоге - прочитай перед началом.

Задать вопрос и получить ответ - уже решено 94 вопросов

Глоссарий - список терминов и сокращений


 
 

Бизнес форум

Последние темы:

Товары для взрослых
24 мая, 1 ответа
Выделенный сервер
23 мая, 3 ответа
Где скачать 1с
21 мая, 1 ответа