Oracle как найти блокировку sql - PullRequest
0 голосов
/ 10 июля 2020

У меня есть приложение java, которое после x количества запросов просто зависает. Глядя на приложение, оно зависает при выполнении запроса к базе данных oracle. Проверил сеанс блокировки с помощью этого sql и получил следующее:

blocking_sessions

Clearly SID 68 is blocking the SID 10. But why isn't it showing the blocking sql? The output from v$lock shows the following locks:

вывод из v $ lock

Как найти фактические блокирующие sqls?

Ответы [ 2 ]

0 голосов
/ 10 июля 2020

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

Рассмотрим следующий сценарий: Сессия 1 - 'ВЫБРАТЬ ДЛЯ ОБНОВЛЕНИЯ ... ГДЕ EMP_ID = '123 "(таким образом блокируя эту строку) СЕССИЯ 1 - .... какой-то другой SQL (еще не зафиксирован) Сессия 1 - .... какой-то другой SQL (еще не зафиксирован) Сессия 1 - .... другой SQL (еще не зафиксирован) Сессия 1 - .... еще какой-то SQL (еще не зафиксирован)

Сессия 2 - 'ВЫБРАТЬ ДЛЯ ОБНОВЛЕНИЯ .. . WHERE EMP_ID = '123 "(заблокирован сеансом 1, который еще не зафиксирован и поэтому все еще удерживает блокировку)

Итак, мы можем знать, что сеанс 1 является сеансом блокировки, но нет вид, который укажет, что это было sql 3, предшествующее текущему sql, которое фактически установило блокировку.

0 голосов
/ 10 июля 2020

В вашем случае сеанс блокировки неактивен, вы должны посмотреть на PREV_SQL_ID в V $ SESSION, чтобы определить последний sql выполненный сеансом, который остается неактивным.

V $ LOCK перечисляет блокировки, которые в настоящее время находятся в базе данных Oracle, и невыполненные запросы на блокировку или защелку. В Oracle есть много типов блокировок, поэтому в этом представлении так много строк.

С уважением,

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