Длинные времена очереди для блокировок строки оракула - PullRequest
2 голосов
/ 11 марта 2010

Я продолжаю сталкиваться с "enq: TX - состязание блокировки строк", когда я запускаю команду Sql ниже в Oracle 9 DB. Таблица mytable представляет собой небольшую таблицу, содержащую менее 300 строк.

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

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

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

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

1 Ответ

2 голосов
/ 11 марта 2010

Если вы не хотите, чтобы вас блокировали, не пытайтесь обновлять вслепую . Сначала выполните SELECT FOR UPDATE NOWAIT. Если вы вызываете исключение (ORA-00054), это означает, что в данный момент с этой строкой работает другой сеанс. В этом случае, в зависимости от ваших требований, вы можете попытаться обновить другую строку (вы пытаетесь создать процесс очереди / удаления очереди), подождать (dbms_lock.sleep) или вернуть сообщение об ошибке вызывающему приложению.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...