Главная » 2010 » Январь » 25 » 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 - идентификатор транзакции.
Из всего этого делаю выводы.
Если у таблицы имеется первичный ключ и несколько сеансов пытаются вставлять одинаковые значения ключа то:
- Строки вставляются в таблицу до проверки уникальности значений ключа.
- Первый сеанс вставляет ключ в индекс и блокирует его.
- Другие сеансы ждут в разделяемом режиме освобождения строки индекса.
- После освобождения блокировки проводиться проверка на уникальность значения ключа которое вставляет следующий сеанс, пытающийся захватить строку индекса.
Но всё равно не могу понять почему режим блокировки в котором висит сеанс называется разделяемым.
P.S. Поправьте меня если я где то ошибся.
|
Просмотров: 635 |
Добавил: dba
| Рейтинг: 0.0/0 |
Добавлять комментарии могут только зарегистрированные пользователи. [ Регистрация | Вход ]
|