У меня есть два запроса Oracle, которые работают в разных сеансах, которые являются взаимоблокирующими, и мне трудно понять, почему это происходит.Почему эти запросы блокируются?
Запрос в сессии 1 заключается в следующем:
UPDATE REFS R SET R.REFS_NAME = :B2 WHERE R.REFS_CODE = :B1
Запрос в сессии 2 заключается в следующем:
UPDATE REFS R SET R.STATUS_CODE = :B3, R.STATUS_TYPE = :B2 WHERE R.REFS_CODE = :B1
Каждый окружен курсором, что петли посредством выбора значений первичного ключа. Когда эти запросы запускаются одновременно, они блокируются. REFS_CODE является основным ключом, а трассировка Oracle показывает, что они обновляют разные rowid. Первичный ключ индексируется, очевидно, и есть некоторые ограничения внешнего ключа, которые поддерживаются индексами, поскольку это было проблемой для нас в прошлом.
Переходя в царство отчаяния, я попытался отключить триггеры на столе, и это не помогло. Также пытался использовать автономные транзакции, но это значительно ухудшало ситуацию.
Есть ли что-то, что мне не хватает? Спасибо за любую помощь!
Только тангенциально: но почему вы используете курсоры вместо того, чтобы просто обновлять диапазон строк, которые вы хотите (возможно, используя что-то вроде второго ответа здесь: http://stackoverflow.com/questions/2446764/oracle-update-statement- с-внутрипартийной присоединиться)? – siride
Какие транзакции у вас есть? – Marvo
@Marvo не уверен, как ответить на это! Обычный вид? Они не являются AUTONOMOUS_TRANSACTION, если это то, что вы просите :) – Kieran