Длительное время ожидания для блокировок строк oracle

StackOverflow https://stackoverflow.com/questions/2425627

  •  19-09-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

Это было полезно?

Решение

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

Ты будешь никогда столкнетесь с тупиковой ситуацией, если сначала заблокируете строку с помощью FOR UPDATE NOWAIT.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top