2015-07-03 3 views
1

У меня есть многопользовательское приложение, которое позволяет многим пользователям выполнять операции DML в таблицах базы данных. В соответствии с конкретным сценарием 2 пользователя пытаются выполнить DELETE в одной таблице с помощью разных транзакций.ORA-00060 при запуске нескольких запросов DELETE в одной таблице

Проблема заключается в том, что транзакция 1 является длинной, и на протяжении длительного времени приобретает Row Lock в таблице. Таким образом, транзакция 2 (попытка изменить одни и те же строки) приводит к ошибкам с ORA-00060. Кроме того, я не могу выполнить Execute Immediate для запросов DELETE при транзакции 1, подавать в суд на некоторые проблемы с целостностью данных.

Как я могу изменить запрос DELETE, чтобы воспроизвести что-то вроде поведения NOLOCK в SQL Server?

+0

См [Понимание Oracle тупиковый] (http://lalitkumarb.com/2014/02/25/understanding-oracle -deadlock /). –

+1

То, что вы объясняете, не должно встречаться с «тупиком», оно будет «блокировать» строки, которые еще предстоит выполнить/откат. Тупик возникает, когда два или более сеанса ждут данных, заблокированных друг от друга, в результате чего все сеансы блокируются. –

+0

Хорошо. Я только выяснил, что транзакция 1 является частью вложенной транзакции. Это вызывает тупик? – jetty

ответ

0

Возможно, у вас есть дочерний стол (или, может быть, таблица внуков), который имеет неиндексированный внешний ключ. См How to find out the cause of an Oracle deadlock

В противном случае файл трассировки может сказать вам, какие строки участвуют, см: How can I identify the rows involved in an Oracle deadlock?

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

  • Нет связанных вопросов^_^