Oracle DB Deadlocks
У нас есть ситуация, когда БД "замедляется". Операции с БД, которые обычно занимают секунду или две, занимают в десять раз больше времени. Когда это происходит, в БД появляется большое количество блокировок. Может ли большое количество тупиков создать медлительность БД?
3 ответа
Взаимные блокировки - это особая ситуация, когда транзакция A блокируется, а затем пытается заблокировать что-то, что в данный момент заблокировано транзакцией B и должно ждать. Затем транзакция B пытается заблокировать элемент, в настоящее время заблокированный транзакцией A. База данных "замечает", что ситуация не может быть разрешена естественным образом, поэтому выдает ошибку одной из транзакций и вынуждает ее выполнить откат.
Как уже говорили другие, это необычно, и я ожидаю, что вы получите сообщения об ошибках, связанных с взаимными блокировками.
Вместо этого я предполагаю, что "что-то" изменилось. Это могут быть блокировки, но в равной степени это может означать, что у вас заблокировано гораздо больше вещей, потому что транзакции занимают больше времени (и, следовательно, блокировки удерживаются дольше).
Если вы используете 10R /11g с AWR/ASH (пакет диагностики / настройки), OEM должен помочь диагностировать ситуацию.
Если нет, посмотрите на V$SESSION и посмотрите, есть ли у вас много сеансов с установленным BLOCKING_SESSION. Это означает, что они ждут замков. Вам нужно беспокоиться только о блокировках, если на них ожидают сеансы, поэтому используйте это, а не количество блокировок. Если это не указывает на проблему, перейдите к v$session_event и посмотрите, какие записи wait_class отвечают за большую часть времени.
Deadlock записываются в файлы трассировки, так что вы можете легко сказать, если это проблема. Сначала проанализируйте для обычных подозреваемых. Запрос объясните план, индексы, статистику и тому подобное.
Это могут быть взаимоблокировки, но базы данных, как правило, могут сообщать о наличии взаимоблокировок и в этом случае уничтожают соединения с исключением из взаимоблокировки.
Я видел, как это происходит в моей базе данных Oracle, и это может случиться, когда ресурсы истощаются, а базе данных не хватает памяти, и ее необходимо перенести на диск.
Это особенно верно, если все задания ожидают в очереди одного и того же ресурса для освобождения.