Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Oracle »

for update

Estas en el tema de for update en el foro de Oracle en Foros del Web. Hola quisiera saber si me pueden ayudar en mi servidor estoy corriendo una consulta con la herramienta PL/SQL Developer hasta en la mañana corria mis ...
  #1 (permalink)  
Antiguo 20/12/2007, 16:57
 
Fecha de Ingreso: diciembre-2007
Mensajes: 5
Antigüedad: 16 años, 4 meses
Puntos: 0
for update

Hola quisiera saber si me pueden ayudar en mi servidor estoy corriendo una consulta con la herramienta PL/SQL Developer hasta en la mañana corria mis consultas incluidas el for update y podia modificar pero ahora estoy tratando de correr la consulta y se queda como colgada la maquina alguna sugerencia del porque esto?
  #2 (permalink)  
Antiguo 20/12/2007, 17:07
Avatar de matanga  
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 16 años, 5 meses
Puntos: 85
Re: for update

Hola,

Cuando ejecutas un SELECT FOR UPDATE, Oracle intenta hacer un lockeo sobre la tabla, pero si la tabla ya esta lockeada se queda esperando a que se libere el recurso, dando la sensacion de colgarse, probablemente tengas otra sesion generando con un lockeo sobre esa tabla.

Creo que el PL/SQL Developer tiene un administrador de sesiones que te permite ver los lockeos y tambien te permite hacer un kill...

Saludos
  #3 (permalink)  
Antiguo 21/12/2007, 03:04
 
Fecha de Ingreso: junio-2007
Mensajes: 891
Antigüedad: 16 años, 10 meses
Puntos: 43
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
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:40.