ora 00054 ресурс занят и задано его получение с параметром nowait либо истекло время ожидания
ORA-00054: ресурс занят и приобретает с указанным NOWAIT или истекшим временем ожидания
Почему я получаю эту ошибку базы данных при обновлении таблицы?
ошибка в строке 1: ORA-00054: ресурс занят и приобретает с указанным NOWAIT или истекшим таймаутом
13 ответов
ваша таблица уже заблокирована некоторым запросом. Как вы выполнили «select for update»и еще не зафиксировали / откат и снова запустили запрос select. Выполните фиксацию / откат перед выполнением запроса.
вы также можете посмотреть sql, имя пользователя, машину, информацию о порте и перейти к фактическому процессу, который содержит соединение
Пожалуйста, Убейте Сеанс Oracle
используйте ниже запрос, чтобы проверить активную информацию о сеансе
(например, alter system kill session ‘13,36543’ 😉
существует очень простая работа вокруг этой проблемы.
Если вы запустите трассировку 10046 на своем сеансе (google this. слишком много, чтобы объяснить). Вы увидите, что перед любой DDL операции Oracle делает следующее:
БЛОКИРОВКА ТАБЛИЦЫ ‘TABLE_NAME’ НЕТ ПОДОЖДИТЕ
поэтому, если другой сеанс имеет открытую транзакцию, вы получаете ошибку. Так что все в порядке. барабанная дробь, пожалуйста. Выдайте свою собственную блокировку перед DDL и оставьте «нет ожидания».
Так. Следующие шаги устраняют проблему.
операторы DML будут «ждать» или, как разработчики называют его «зависать», пока таблица заблокирована.
Я использую это в коде, который запускается из задания для удаления разделов. Работает отлично. Он находится в базе данных, которая постоянно вставляет со скоростью несколько сотен вставок в секунду. Никакая ошибка.
Если вам интересно. Делаем это в 11g. Я сделал это в 10g раньше, а также в прошлом.
эта ошибка возникает, когда ресурс занят. Проверьте, есть ли в запросе какие-либо ссылочные ограничения. Или даже таблицы, которые вы упомянули в запросе, могут быть заняты. Они могут быть заняты каким-то другим заданием, которое будет определенно указано в следующих результатах запроса:
в производственной системе, это действительно зависит. Для oracle 10g и старше вы можете выполнить
в отдельном сеансе, но имейте следующее готовое в случае, если это займет слишком много времени.
Это зависит от того, какая система у вас есть, более старые системы, скорее всего, не будут совершать каждый раз. Это проблема, так как могут быть длительные замки. Таким образом, ваш замок предотвратит любые новые замки и дождется блокировки, которая, кто знает, когда будет выпущена. Вот почему у вас наготове другое заявление. Или вы можете искать скрипты PLSQL, которые делают подобные вещи автоматически.
в версии 11g есть новая переменная среды, которая устанавливает время ожидания. Я думаю, что он, вероятно, делает что-то похожее на то, что я описал. Имейте в виду, что проблемы с блокировкой не уходят прочь.
наконец, может быть лучше подождать, пока в системе будет мало пользователей для такого обслуживания.
ORA-00054: ресурс занят и получен с указанным значением NOWAIT или истекло время ожидания
Почему я получаю эту ошибку базы данных при обновлении таблицы?
ОШИБКА в строке 1: ORA-00054: ресурс занят и получен с указанным NOWAIT или истекло время ожидания
12 ответов
Ваша таблица уже заблокирована каким-либо запросом. Например, вы, возможно, выполнили команду «выбрать для обновления» и еще не зафиксировали /откатили и не запустили еще один запрос на выборку. Сделайте коммит /откат перед выполнением запроса.
Вы также можете посмотреть информацию о sql, имени пользователя, машине, порте и перейти к фактическому процессу, который содержит соединение
Пожалуйста, убейте сессию Oracle
Используйте приведенный ниже запрос для проверки информации об активной сессии
(Например, alter system kill session ‘13,36543’ 😉
Существует очень легко обойти эту проблему.
LOCK TABLE ‘TABLE_NAME’ NO WAIT
DML-операторы будут «ждать» или, как разработчики называют, «зависать», пока таблица заблокирована.
Я использую это в коде, который запускается из задания для удаления разделов. Работает нормально. Он находится в базе данных, которая постоянно вставляется со скоростью несколько сотен вставок в секунду. Нет ошибок
если вам интересно. Делать это в 11г. Я делал это в 10g и раньше, и раньше.
Эта ошибка возникает, когда ресурс занят. Проверьте, есть ли у вас ссылочные ограничения в запросе. Или даже таблицы, которые вы упомянули в запросе, могут быть заняты. Они могут быть заняты другой работой, которая обязательно будет указана в следующих результатах запроса:
Это происходит, когда сеанс, отличный от сеанса, используемого для изменения таблицы, удерживает блокировку из-за DML (обновление /удаление /вставка). Если вы разрабатываете новую систему, вполне вероятно, что вы или кто-то из вашей команды выдает оператор обновления, и вы можете прервать сеанс без особых последствий. Или вы можете выполнить коммит из этого сеанса, когда узнаете, у кого этот сеанс открыт.
В производственной системе это действительно зависит. Для оракула 10g и старше вы можете выполнить
В отдельном сеансе готово следующее, если это займет слишком много времени.
Это зависит от того, какая у вас система, более старые системы, скорее всего, не будут фиксировать каждый раз. Это проблема, так как могут быть затяжные замки. Таким образом, ваша блокировка предотвратит любые новые блокировки и будет ждать блокировки, которая знает, когда она будет снята. Вот почему у вас есть другое заявление готово. Или вы можете поискать сценарии PLSQL, которые автоматически выполняют похожие действия.
В версии 11g появилась новая переменная среды, которая устанавливает время ожидания. Я думаю, что это, вероятно, делает нечто похожее на то, что я описал Имейте в виду, что проблемы с блокировкой не исчезают.
Наконец, возможно, лучше подождать, пока в системе не останется мало пользователей, выполняющих такое обслуживание.
Ваша проблема выглядит так, как будто вы смешиваете DML & DDL операции. Посмотрите этот URL, который объясняет эту проблему:
Просто проверьте процесс, удерживающий сеанс, и убейте его. Спина к норме.
Ниже SQL найдет ваш процесс
Некоторые примеры, которые я нашел в Интернете, похоже, нуждаются в идентификаторе экземпляра. изменить сеанс уничтожения системы ‘130 620, @ 1’;
Я нашел оскорбительный сеанс с:
SELECT * FROM V$SESSION WHERE OSUSER=’my_local_username’;
Убил сеанс с помощью ID и SERIAL# приобретено выше:
Мне удалось обнаружить эту ошибку при простом создании таблицы! Очевидно, на столе, который еще не существовал, не было проблем с конкуренцией. Оператор CREATE TABLE содержал ссылку на предложение CONSTRAINT fk_name FOREIGN KEY густонаселенный стол. Я должен был:
Я имел эту ошибку, когда у меня было 2 сценария, которые я выполнял. У меня было:
Я решил это, запустив COMMIT; в сеансе SQL * Plus учетной записи №2.
Я также сталкиваюсь с подобной проблемой. Программисту ничего не нужно делать, чтобы устранить эту ошибку. Я сообщил своей команде оракула DBA. Они убивают сеанс и работают как заклинание.
ORA-00054: ресурс занят и приобретается с указанным NOWAIT или истечением времени ожидания
Почему я получаю эту ошибку базы данных при обновлении таблицы?
ОШИБКА в строке 1: ORA-00054: ресурс занят и приобретается с указанным NOWAIT или истечением времени ожидания.
Ваша таблица уже заблокирована каким-либо запросом. Например, вы, возможно, выполнили команду “выбрать для обновления”, но еще не зафиксировали/откатили и не запустили еще один запрос на выборку. Сделайте коммит/откат перед выполнением вашего запроса.
Вы также можете найти информацию о sql, username, machine, port и перейти к фактическому процессу, который содержит соединение
Убейте сеанс Oracle Session
Используйте следующий запрос, чтобы проверить информацию активного сеанса
(Например, alter system kill session ‘13,36543’ 😉
Для этой проблемы очень легко работать.
Если вы запустите трассировку 10046 на своем сеансе (Google слишком… чтобы объяснить). Вы увидите, что перед любой DDL-операцией Oracle делает следующее:
LOCK TABLE ‘TABLE_NAME’ NO WAIT
Итак, если другой сеанс имеет открытую транзакцию, вы получаете сообщение об ошибке. Так что исправить… барабан рулон пожалуйста. Выпустите свой собственный замок перед DDL и оставьте “NO WAIT”.
Если вы выполняете разделение/удаление разделов, oracle просто блокирует раздел.
– так что вы можете просто заблокировать подразделение.
Итак…
Следующие шаги устраняют проблему.
Операторы DML будут “ждать” или как разработчики называют это “зависанием”, пока таблица заблокирована.
Я использую это в коде, который запускается из задания для удаления разделов. Он работает нормально. Он находится в базе данных, которая постоянно вставляется со скоростью в несколько сотен вставок в секунду. Нет ошибок.
если вам интересно. Делаю это в 11г. Я делал это в 10 г раньше, чем в прошлом.
Эта ошибка возникает, когда ресурс занят. Проверьте, есть ли в запросе какие-либо ссылочные ограничения. Или даже таблицы, которые вы упомянули в запросе, могут быть заняты. Они могут быть связаны с другим заданием, которое будет определенно указано в следующих результатах запроса:
В производственной системе это действительно зависит. Для оракула 10g и старше вы можете выполнить
В отдельном сеансе, но в следующем случае он готов к завершению.
В зависимости от того, какая система у вас есть, более старые системы с большей вероятностью не будут совершать каждый раз. Это проблема, так как могут быть длительные постоянные замки. Таким образом, ваш замок предотвратит любые новые блокировки и дождитесь блокировки, которая знает, когда будет выпущена. Вот почему у вас есть другое выражение готово. Или вы можете искать скрипты PLSQL, которые делают подобные вещи автоматически.
В версии 11g есть новая переменная среды, которая устанавливает время ожидания. Я думаю, что это похоже на то, что я описал. Имейте в виду, что проблемы с блокировкой не исчезают.
Наконец, лучше всего подождать, пока в системе не будет мало пользователей для такого обслуживания.
В моем случае я был совершенно уверен, что это была одна из моих сессий, которая блокировала. Поэтому было безопасно сделать следующее:
Я нашел оскорбительную сессию с:
SELECT * FROM V$SESSION WHERE OSUSER=’my_local_username’;
Сеанс был неактивным, но все равно как-то удерживал блокировку. Обратите внимание, что вам может потребоваться использовать какое-то другое условие WHERE в вашем случае (например, попробуйте поля USERNAME или MACHINE ).
Отредактировано @thermz: Если ни один из предыдущих запросов открытого сеанса не работает, попробуйте этот. Этот запрос может помочь вам избежать синтаксических ошибок при отмене сеансов:
Ваша проблема выглядит так, как будто вы смешиваете DML & DDL операции. Посмотрите этот URL, который объясняет эту проблему:
Просто проверьте процесс проведения сессии и убейте его. Его обратно в норму.
Ниже SQL найдет ваш процесс
Некоторый пример, который я нашел в Интернете, также нуждается в идентификаторе экземпляра
alter system kill session ‘130,620, @1’;
У меня была эта ошибка, когда у меня было 2 сценария, которые я запускал. У меня было:
Я решил это, запустив COMMIT; в сеансе SQL * Plus учетной записи №2.
Удаление моего сообщения, поскольку оно не полезно в контексте вопроса. ORA-00054 происходит главным образом при выполнении DDL (ALTER, TRUNCATE и т.д.).
SELECT FOR UPDATE является единственным исключением как DML, я думаю.
Я также сталкиваюсь с аналогичной проблемой. Для устранения этой ошибки ничего не требуется программисту. Я сообщил моей команде DBA оракула. Они убивают сеанс и работают как шарм.
Решение, данное ссылкой Shashi, является лучшим… не нужно связываться с dba или кем-то еще