Re: for update Buenas.
Totalmente de acuerdo, añado algo. Creo, solo creo que el lockeo que hace en esos casos no es exclusivo, sino a nivel de los registros afectados.
Y lo del kill, mucho ojito con eso. Puede darse el caso de que ese proceso no muera con el kill sessiony se quede "ZOMBIE" y haya que matar la session a nivel de sistema operativo ( El KILL -9 de unix ). Para hacer esto, a nivel de base de datos tienes que tener permisos de DBA y a nivel de UNIX, de root
Os pongo un par de consultas, la primera para detectar bloqueos a nivel de tabla en la que te muestra todos los datos del bloqueador y del que está bloqueado y la segunda para ver datos de sesion, procesos y demas. Muy util para entre otras cosas ver el SID y el SERIAL# para hacer un kill session y el SPID para hacer un kill-9.
SELECT /*+ CHOOSE */
BS.USERNAME "BLOCKING_USER",
BS.USERNAME "DB_USER",
BS.OSUSER "BLOCKING_OSUSER",
WS.USERNAME "WAITING_USER",
WS.OSUSER "WAITING_OSUSER",
BS.SID "SID",
WS.SID "WSID",
BS.SQL_ADDRESS "ADDRESS",
BS.SQL_HASH_VALUE "SQL_HASH",
BS.PROGRAM "BLOCKING_APP",
WS.PROGRAM "WAITING_APP",
BS.MACHINE "BLOCKING_MACHINE",
WS.MACHINE "WAITING_MACHINE",
BS.OSUSER "BLOCKING_OS_USER",
WS.OSUSER "WAITING_OS_USER",
BS.SERIAL# "SERIAL",
DECODE(wk.TYPE,
'MR', 'Media Recovery',
'RT', 'Redo Thread',
'UN', 'USER Name',
'TX', 'Transaction',
'TM', 'DML',
'UL', 'PL/SQL USER LOCK',
'DX', 'Distributed Xaction',
'CF', 'Control FILE',
'IS', 'Instance State',
'FS', 'FILE SET',
'IR', 'Instance Recovery',
'ST', 'Disk SPACE Transaction',
'TS', 'Temp Segment',
'IV', 'Library Cache Invalidation',
'LS', 'LOG START OR Switch',
'RW', 'ROW Wait',
'SQ', 'Sequence Number',
'TE', 'Extend TABLE',
'TT', 'Temp TABLE',
wk.TYPE) lock_type,
DECODE(hk.lmode,
0, 'None',
1, 'NULL',
2, 'ROW-S (SS)',
3, 'ROW-X (SX)',
4, 'SHARE',
5, 'S/ROW-X (SSX)',
6, 'EXCLUSIVE',
TO_CHAR(hk.lmode)) mode_held,
DECODE(wk.request,
0, 'None',
1, 'NULL',
2, 'ROW-S (SS)',
3, 'ROW-X (SX)',
4, 'SHARE',
5, 'S/ROW-X (SSX)',
6, 'EXCLUSIVE',
TO_CHAR(wk.request)) mode_requested,
TO_CHAR(hk.id1) lock_id1,
TO_CHAR(hk.id2) lock_id2
FROM
v$lock hk, v$session bs,
v$lock wk, v$session ws
WHERE
hk.block = 1
AND hk.lmode != 0
AND hk.lmode != 1
AND wk.request != 0
AND wk.TYPE (+) = hk.TYPE
AND wk.id1 (+) = hk.id1
AND wk.id2 (+) = hk.id2
AND hk.sid = bs.sid(+)
AND wk.sid = ws.sid(+)
ORDER BY 1
select p.SPID, s.SID, s.SERIAL#, s.USERNAME, s.LOCKWAIT, s.STATUS,
s.OSUSER, s.MACHINE, s.TERMINAL, s.PROGRAM, s.LOGON_TIME
from v$session s, v$process p
where p.addr(+)=s.paddr
order by SID -- s.osuser |