Найти сеанс заблокированной строки
Я испытываю row lock contention
в моем оракуле БД. Я пытался убить некоторые сессии, чтобы разблокировать их, но эти строки все еще заблокированы. Я точно знаю, какой ряд заблокирован. Могу ли я найти идентификатор сеанса, который заблокировал эту строку. Я могу получить ROWID
из этого ряда.
1 ответ
Как говорят хорошие люди в AskTom, мы не поддерживаем список заблокированных строк
Но, если вы хотите попробовать это - он покажет вам блокировки по USER в вашей базе данных, включая блокировки строк.
SELECT
p.username username,
p.pid pid,
s.sid sid,
s.serial# serial,
p.spid spid,
s.username ora,
DECODE(l2.type, 'TX', 'TRANSACTION ROW-LEVEL', 'RT', 'REDO-LOG', 'TS', 'TEMPORARY SEGMENT ', 'TD', 'TABLE LOCK', 'TM', 'ROW LOCK'
, l2.type) vlock,
DECODE(l2.type, 'TX', 'DML LOCK', 'RT', 'REDO LOG', 'TS', 'TEMPORARY SEGMENT', 'TD', DECODE(l2.lmode + l2.request, 4, 'PARSE '
|| u.name || '.' || o.name, 6, 'DDL', l2.lmode + l2.request), 'TM', 'DML ' || u.name || '.' || o.name, l2.type) type,
DECODE(l2.lmode + l2.request, 2, 'RS', 3, 'RX', 4, 'S', 5, 'SRX', 6, 'X', l2.lmode + l2.request) lmode,
DECODE(l2.request, 0, NULL, 'WAIT') wait
FROM
gv$process p,
gv$_lock l1,
gv$lock l2,
gv$resource r,
sys.obj$ o,
sys.user$ u,
gv$session s
WHERE
s.paddr = p.addr
AND s.saddr = l1.saddr
AND l1.raddr = r.addr
AND l2.addr = l1.laddr
AND l2.type <> 'MR'
AND r.id1 = o.obj# (+)
AND o.owner# = u.user# (+)
--AND u.name = 'GME'
AND ( :user_name IS NULL
OR s.username LIKE upper(:user_name) )
ORDER BY
p.username,
p.pid,
p.spid,
ora,
DECODE(l2.type, 'TX', 'TRANSACTION ROW-LEVEL', 'RT', 'REDO-LOG', 'TS', 'TEMPORARY SEGMENT ', 'TD', 'TABLE LOCK', 'TM', 'ROW LOCK'
, l2.type)
Это отчет в SQL Developer.