2015-02-12 2 views
0

Я создал блокировки на 3 сеансах таблицы записей базы данных TX.SQL-lock select check

Далее я написал запрос, чтобы проверить замки на базе Oracle, но что-то не так:

select 
    round(s1.seconds_in_wait/60,1) as TIME, s1.event, 
    s1.blocking_session as SID_A, s1.username as USER_A, 
    s2.sid as SID_B, s2.username as USER_B 
from 
    v$session s1, v$session s2 
where 
    s1.blocking_session is not null 
    and s1.seconds_in_wait > 1 
    and s1.sid = s2.sid 
order by 
    s1.seconds_in_wait desc; 

Результат:

| Time | Evetn    |SID_A| USER_A |SID_B| USER_B | 
------------------------------------------------------------- 
|10.1 | enq: TX row lock.. | 45 | Schema1 | 54 | Schema1 | 
|15.5 | enq: TX row lock.. | 45 | Schema2 | 95 | Schema2 | 

Скорее это должно быть что-то вроде этого:

| Time | Evetn    |SID_A| USER_A |SID_B| USER_B | 
------------------------------------------------------------- 
|10.1 | enq: TX row lock.. | 45 | Schema1 | 54 | Schema2 | 
|15.5 | enq: TX row lock.. | 45 | Schema1 | 95 | Schema3 | 

Где проблема, пожалуйста, помогите.

+1

[Вредные привычки пинать: использование старого стиля JOIN и] (HTTP: // sqlblog. com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins.aspx) - этот список таблиц * в стиле старого стиля * должен быть ** нет дольше использовать **, и вместо этого рекомендуется использовать ** соответствующий ANSI JOIN ** синтаксис, введенный с ANSI - ** 92 ** SQL Standard (более ** 20 лет ** назад) –

ответ

3

Вы присоединяетесь к s1.sid=s2.sid - который присоединится к ряду с самим собой. Я думаю, что вы хотите присоединиться, используя блокирующую SID:

select 
    round(s1.seconds_in_wait/60,1) as TIME, s1.event, 
    s1.sid as SID_A, s1.username as USER_A, 
    s2.sid as SID_B, s2.username as USER_B 
from 
    v$session s1, v$session s2 
where 
    s1.blocking_session is not null 
    and s1.seconds_in_wait > 1 
    and s1.blocking_session = s2.sid 
order by 
    s1.seconds_in_wait desc; 

Или (с использованием ANSI соединения):

select 
    round(s1.seconds_in_wait/60,1) as TIME, s1.event, 
    s1.sid as SID_A, s1.username as USER_A, 
    s2.sid as SID_B, s2.username as USER_B 
from 
    v$session s1 
join 
    v$session s2 
on 
    s1.blocking_session = s2.sid 
where 
    s1.blocking_session is not null 
    and s1.seconds_in_wait > 1 
order by 
    s1.seconds_in_wait desc; 
Смежные вопросы