Bloqueos en oracle
http://javalangnullpointer.wordpress.com/2007/02/19/detectar-bloqueos-en-oracle/
En Oracle hay una vista v$lock que nos indica los objetos que se encuentran enbloqueo, el identificador de usuario y sesion y el tipo de bloqueo.
Un join con la tabla dba_objects nos proporciona ademas el nombre y tipo de los objetos bloqueados:
SELECTdecode(L.TYPE,'TM','TABLE','TX','Record(s)') TYPE_LOCK,
decode(L.REQUEST,0,'NO','YES') WAIT,
S.OSUSER OSUSER_LOCKER,
S.PROCESS PROCESS_LOCKER,
S.USERNAME DBUSER_LOCKER,
O.OBJECT_NAME OBJECT_NAME,
O.OBJECT_TYPEOBJECT_TYPE,
concat(' ',s.PROGRAM) PROGRAM,
O.OWNER OWNER
FROM v$lock l,dba_objects o,v$session s
WHERE l.ID1 = o.OBJECT_ID
AND s.SID =l.SID
AND l.TYPE in ('TM','TX');
[pic]
Existenprincipalmente dos tipos de bloqueo:
bloqueos de tablas (TM) y
bloqueos a nivel de fila (TX)
Los bloqueos a nivel de tabla son creados cuando se ejecuta una sentencia DML del tipo: update, insert, delete,select ..for update sobre la tabla entera. Por ejemplo:
DELETE from mitabla;
UPDATE mitabla SET campo1 = valor;
Los bloqueos a nivel de fila se crean cuando se ejecutan senencias DML contra unconjunto de registros específicos.
Una consulta sobre esta vista nos permite rapidamente saber que procesos estan bloqueados y si ademas hacemos un join con v$open_cursor podemos ver que consulta esla que se encuentra parada a la espera de que se produzca el desbloqueo para poder ejecutarse. En la consulta siguiente podemos ver las sentencias paradas y el id de proceso que las esta bloqueando.-- he adaptado la consulta con sys. pq la lanzaba desde un usuario que no era sys. esta query permite ver los objetos que estan esperando a que termine un bloqueo y la sentencia que quieren ejecutar.el id de proceso nos da la pista de quien esta bloqueando
select /*+ ordered
no_merge(L_WAITER)
no_merge(L_LOCKER) use_hash(L_LOCKER)
no_merge(S_WAITER) use_hash(S_WAITER)
no_merge(S_LOCKER)...
Regístrate para leer el documento completo.