см. Sites.google.com/site/embtdbo/wait-event-documentation/oracle-enqueues
Ожидание блокировки указывает на конфликт, который может легко вызвать проблемы с производительностью.На первый взгляд кажется вероятным, что проблема заключается в вставке дублированного значения ключа, в то время как первая вставка этого значения ключа еще не зафиксирована.Блокировка «enq: TX - конкуренция за блокировку строки» возникает из-за того, что один сеанс пытается изменить незафиксированные данные другого сеанса.Существует 4 распространенных причины этого конкретного события ожидания блокировки:
- обновление / удаление той же строки
- вставка того же ключа uniq
- изменение того же фрагмента индекса битовой карты
- удаление / обновление родительского значения для внешнего ключа
Мы можем исключить первый и последний случай, если вы делаете вставку.Вы должны быть в состоянии идентифицировать 2-й, если у вас нет задействованных растровых индексов.Если у вас задействованы растровые индексы и задействованы уникальные ключи, вы можете легко исследовать, если у вас есть данные Active Session History (ASH), но, к сожалению, Oracle XE этого не делает.С другой стороны, вы можете собрать его самостоятельно с помощью S-ASH, см .: http://ashmasters.com/ash-simulation/.С ASH или S-ASH вы можете запустить запрос, подобный
col event for a22
col block_type for a18
col objn for a18
col otype for a10
col fn for 99
col sid for 9999
col bsid for 9999
col lm for 99
col p3 for 99999
col blockn for 99999
select
to_char(sample_time,'HH:MI') st,
substr(event,0,20) event,
ash.session_id sid,
mod(ash.p1,16) lm,
ash.p2,
ash.p3,
nvl(o.object_name,ash.current_obj#) objn,
substr(o.object_type,0,10) otype,
CURRENT_FILE# fn,
CURRENT_BLOCK# blockn,
ash.SQL_ID,
BLOCKING_SESSION bsid
--,ash.xid
from v$active_session_history ash,
all_objects o
where event like 'enq: TX %'
and o.object_id (+)= ash.CURRENT_OBJ#
Order by sample_time
/
, который будет выводить что-то вроде:
ST EVENT SID LM P2 P3 OBJ OTYPE FN BLOCKN SQL_ID BSID
10:41 enq: TX - row lock c 143 4 966081 4598 I1 INDEX 0 0 azav296xxqcjx 144
10:41 enq: TX - row lock c 143 4 966081 4598 I1 INDEX 0 0 azav296xxqcjx 144
10:41 enq: TX - row lock c 143 4 966081 4598 I1 INDEX 0 0 azav296xxqcjx 144
10:41 enq: TX - row lock c 143 4 966081 4598 I1 INDEX 0 0 azav296xxqcjx 144
, показывающее, что имя объекта "OBJ" и тип объекта "OTYPE" с конфликтомтип является индексом.Оттуда вы можете посмотреть тип INDEX, чтобы убедиться, что это растровое изображение.Если проблема заключается в растровом индексе, то вам, вероятно, следует переоценить использование растровых индексов или пересмотреть способ загрузки и / или изменения данных, чтобы уменьшить конфликты.
Если проблема не в индексах BITMAP, тоон пытается вставить дубликат ключа.Какой-то другой процесс вставил то же значение ключа и еще не зафиксировал.Затем ваш процесс пытается вставить то же значение ключа и должен дождаться, когда первый сеанс будет зафиксирован или откат.
Для получения дополнительной информации см. Эту ссылку: блокировка ждет