2010-03-11 3 views
2

Я продолжаю работать в «enq: TX - конфликт строк», когда я запускаю команду Sql ниже в DB оракула 9. Таблица mytable - это небольшой стол с менее чем 300 линиями.Длинные очереди для блокировок строк оракула

UPDATE MYTABLE 
SET  col1 = col1 + :B3 , 
     col2 = SYSDATE 
WHERE :B2   = col3 
    AND :B1  = col4 

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

Редактировать: Я не могу изменить этот код, он находится в стороннем приложении. Я могу только настроить БД.

Что я могу сделать, чтобы улучшить скорость очереди строк? Как я могу улучшить это время ожидания, чтобы потоки выполнялись быстрее?

+0

Сколько строк влияет на ваши обновления? –

+0

Каждое обновление затрагивает только одну строку. Но много раз у меня есть десять потоков, пытающихся обновить ту же строку. – kurast

ответ

2

Если вы не хотите быть заблокированным, не пытайтесь обновить слепо. Сначала выполните ВЫБОР ДЛЯ ОБНОВЛЕНИЯ NOWAIT. Если вы создаете исключение (ORA-00054), это означает, что в данный момент работает другая сессия с этой строкой. В этом случае, в зависимости от вашего требования, вы можете попытаться обновить еще одну строку (пытаетесь ли вы создать процесс очереди/деактивации?), Wait (dbms_lock.sleep) или вернуть сообщение об ошибке вызывающему приложению.

Вы будете Никогда не столкнулись с тупиком, если вы заблокируете строку с FOR UPDATE NOWAIT.

+0

забыл сказать, но я не могу изменить код. теперь я отредактировал мой вопрос – kurast

+1

@ kurast: само обновление, вероятно, не займет много времени. Время тратится на ожидание ** других сеансов ** для фиксации/откат. Если эти потоки являются фоновыми партиями, возможно, конкуренция ожидается/не вредна. Если они активны передними сессиями, почему они пытаются обновить одну и ту же строку? –

Смежные вопросы