Ошибка при попытке удалить строки из таблицы - PullRequest
0 голосов
/ 28 августа 2018

У меня есть DELETE оператор delete from test where id = :a в пакете, который вызывается из Java. Каждый сеанс пытается удалить различный набор строк из одной и той же таблицы test, но все равно я получаю ошибку ORA-00060: deadlock detected while waiting for resource.

Любая помощь, что здесь могло пойти не так.

Я вижу ниже в файле трассировки, но я все еще не мог понять, почему именно я получаю тупик.

*** 2018-08-28 06:55:08.128
DEADLOCK DETECTED ( ORA-00060 )
See Note 60.1 at My Oracle Support for Troubleshooting ORA-60 Errors
[Transaction Deadlock]

The following deadlock is not an ORACLE error. It is a
deadlock due to user error in the design of an application
or from issuing incorrect ad-hoc SQL. The following
information may aid in determining the deadlock:

Deadlock graph:
                                          ---------Blocker(s)--------  ---------Waiter(s)---------
Resource Name                             process session holds waits  process session holds waits
TM-00049B33-00000000-00000000-00000000        288    2274    SX   SSX      320    2566    SX   SSX
TM-00049B46-00000000-00000000-00000000        320    2566    SX            142    1851    SX   SSX
TM-00049B33-00000000-00000000-00000000        142    1851    SX            288    2274    SX   SSX

session 2274: DID 0001-0120-00000406    session 2566: DID 0001-0140-00000019 
session 2566: DID 0001-0140-00000019    session 1851: DID 0001-008E-0001311B 
session 1851: DID 0001-008E-0001311B    session 2274: DID 0001-0120-00000406

Rows waited on:
  Session 2274: no row
  Session 2566: no row
  Session 1851: no row

есть ли причина не показывать ROWID в файле трассировки?

Ответы [ 4 ]

0 голосов
/ 28 августа 2018

Эта проблема часто возникает из-за отсутствия индексов. Если в вашем выражении удаления отсутствует произвольный индекс для выражения where, оракул не только заблокирует записи, которые вы собираетесь удалить, но и выполнит блокировку таблицы. Убедитесь, что у вас есть индекс, который содержит большинство столбцов, используемых в предложении where вашего оператора удаления.

0 голосов
/ 28 августа 2018

Когда происходит тупик, Вы можете подождать несколько минут и попытаться повторно выполнить оператор (ы), которые были откатаны.

Вы можете выполнить ROLLBACK и повторно выполнить все операторы с момента последнего выполнения COMMIT.

Я не уверен в этом ... но вы можете сослаться на ссылку этого сайта http://www.dba -oracle.com / t_ora_00060_deadlock_detected_ while_waiting_for_resource.htm ...

0 голосов
/ 28 августа 2018

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

Допустим, я удаляю элемент 1, а вы удаляете элемент 2, и никто из нас не подтверждает это.

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

Теперь вы пытаетесь удалить элемент 1. Вы не можете, потому что мое незафиксированное удаление все еще блокирует эту строку. Теперь вы заблокированы моим сеансом, но я уже заблокирован вами. (Вам нужно, чтобы я либо зафиксировал, либо откатился, но я не могу ничего сделать, потому что я заблокирован вами.) Оба сеанса будут ждать вечно.

Oracle обнаруживает эту ситуацию и вмешивается, отменяя и откатывая одну из транзакций, вызывая ORA-00060 и записывая тупиковый отчет в журнал предупреждений базы данных.

Проверьте подробности в журнале оповещений и просмотрите логику приложения, чтобы предотвратить это в будущем.

Редактировать - спасибо за размещение подробностей трассировки.

Сессия 2274 ожидала 2566 (получить блокировку режима SSX).
Сессия 2566 ждала 1851 года.
Сессия 1851 ждала 2274.

Некоторые примечания по режимам блокировки: https://jonathanlewis.wordpress.com/2010/06/21/locks

SSX (share sub exclusive) связан с 'Lock table in share row exclusive mode'. Иногда блокировки и связанные с ними режимы не очевидны, например, прямой путь insert в таблицу или каскадное удаление через внешний ключ (особенно если дочерний ключ неиндексирован) приведет к блокировкам, которых вы, возможно, не ожидаете.

В ответах на этот вопрос также могут быть некоторые подсказки: Поиск причины тупиковой ошибки из файла трассировки оракула

0 голосов
/ 28 августа 2018

В тот момент, когда вы пытаетесь удалить строки, другой процесс, кажется, обращается к этим строкам одновременно. Первый процесс блокирует эти строки. Это известно как «состояние гонки». Это может быть ваша процедура пакета, которая вызывает проблему, или это может быть что-то еще (вам придется проанализировать ваш код).

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