Приветствую Вас Гость | RSS

DBA.UCOZ.RU

Пятница, 08.08.2025, 11:12
Главная » 2010 » Январь » 25 » TX в режиме 4
11:24
TX в режиме 4
Все выходные угробил на поиск ответа на вопрос. Что такое TX блокировка в разделяемом режиме. Тестирование производил на вставке двух одинаковых первичных ключей в обычный таблицу. Вопрос  конечно сложный. Если с исключительным режимом TX при вставке всё понятно. Транзакция вставляется строку и добавляет в свободный ITL информацию о блокировке. Если другая транзакция попытается изменить строку, то она прочитает данные из слота связанного со строкой и будет ожидать освобождения транзакции.
При TX блокировке в 4 режиме ситуация немного другая. Выяснил следующее. Если несколько сеансов добавляют строки с одним первичным ключом в обыкновенную таблицу, то вначале эти строки вставляются в блоки таблицы обычным образом. Затем блокируются выставлением TX блокировки в исключительном режиме. Первый сеанс вставляет ключ в блок индекса первичного ключа и выставляет TX блокировку в исключительном режиме на эту строку индекса. Второй и последующие сеансы делают запрос TX блокировки в разделяемом режиме на эту строку  и ждут освобождения TX блокировки в исключительном режиме в первом сеансе.

Демонстрирую состояние блоков таблицы и индекса при ожидании.

Таблица:

 Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   0x0001.02a.000000b4  0x00801052.006b.3e  ----    1  fsc 0x0000.00000000
0x02   0x0002.01d.000000af  0x00800b7f.005d.0b  ----    1  fsc 0x0000.00000000 


tl: 14 fb: --H-FL-- lb: 0x1  cc: 2
col  0: [ 2]  c1 02
col  1: [ 7]  d1 f2 f0 ee ea e0 31
tab 0, row 1, @0x1f60
tl: 14 fb: --H-FL-- lb: 0x2  cc: 2
col  0: [ 2]  c1 02
col  1: [ 7]  d1 f2 f0 ee ea e0 31


Строки вставлены и заблокированы. Скорее всего в исключительном режиме. Именно для этого нужна ещё одна блокировка TX в исключительном режиме для ожидающего сеанса.

Индекс первичного ключа:

 Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   0x0000.000.00000000  0x00000000.0000.00  ----    0  fsc 0x0000.00000000
0x02   0x0001.02a.000000b4  0x00801052.006b.3f  ----    1  fsc 0x0000.00000000

row#0[8025] flag: ------, lock: 2, len=11, data:(6):  01 00 01 67 00 00
col 0; len 2; (2):  c1 02


Вставлен первичный ключ в блок индекса и заблокирован в первом сеансе. Здесь скорее всего и идёт ожидание TX для других сеансов. Правда мне так и не понятно почему оно называется разделяемым.

Пояснения:

Lck - флаг блокировки строки.
Itl - номер записи ITL (слот).
lb - номер записи ITL связанный со строкой (слот).
Xid - идентификатор транзакции.
  
Из всего этого делаю выводы.

Если у таблицы имеется первичный ключ и несколько сеансов пытаются вставлять одинаковые значения ключа то:
  1. Строки вставляются в таблицу до проверки уникальности значений ключа.
  2. Первый сеанс вставляет ключ в индекс и блокирует его.
  3. Другие сеансы ждут в разделяемом режиме освобождения строки индекса.
  4. После освобождения блокировки проводиться проверка на уникальность значения ключа которое вставляет следующий сеанс, пытающийся захватить строку индекса.  
Но всё равно не могу понять почему режим блокировки в котором висит сеанс называется разделяемым.

P.S. Поправьте меня если я где то ошибся.

Просмотров: 635 | Добавил: dba | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]