sql >> Base de Datos >  >> RDS >> Oracle

Oracle Locks y table locks:Cómo funciona

La base de datos de Oracle es la base de datos más utilizada en la industria. Aquí estoy tratando de explicar sobre los bloqueos de Oracle, los bloqueos de tablas de Oracle

Índice

  • ¿Qué es Oracle Enqueue y bloqueos
  • ¿Qué es el identificador de puesta en cola
  • ¿Qué es el recurso Encolar
  • ¿Cómo se realiza la búsqueda en la tabla de recursos?
  • ¿Cómo funcionan las operaciones en cola?
  • Cómo se verifica la cola cuando se libera o convierte el bloqueo de Oracle
  • Tipos comunes de puesta en cola
  • Vistas y tabla para ver la puesta en cola de Oracle y los bloqueos de Oracle
    • V$sesión y v$sesión_esperar
    • V$locked_object
  • Cómo se manejan los bloqueos DML en el servidor de Oracle
  • Cómo se implementan los bloqueos de tablas de Oracle
  • ¿Cómo desactivar los bloqueos de tabla?
  • Cómo se implementan los bloqueos de fila DML
  • ¿Qué es la lista de transacciones interesadas (ITL)
  • ¿Qué es una transacción?
  • Ejemplo detallado para explicar el funcionamiento de los bloqueos de Oracle
  • Cursos  recomendados

Qué es Oracle Enqueue y bloqueos

Enqueue son bloqueos de Oracle que serializan las operaciones en la estructura compartida. La estructura compartida podría ser una tabla, rehacer subprocesos y transacciones.

Cuando un usuario A actualiza una fila 12 en la tabla, adquiere la transacción Enqueue (bloqueo). Esto se adquiere para que cualquier usuario que intente actualizar esa misma fila 12 en la tabla esperará hasta que el usuario A confirme la transacción. Así que ahora, si el usuario B intenta actualizar la misma fila, esperará en la cola.

Una vez que el usuario A confirma la transacción, la transacción del usuario B continuará

Tenemos puesta en cola local en la base de datos de instancia única, mientras que con Oracle RAC, tenemos puesta en cola local y puesta en cola global para administrar el recurso compartido

¿Qué es el identificador de puesta en cola

En cola se identifican de forma única mediante el formato

El recurso puede

TM -> bloqueos de mesa

MR-> Recuperación de medios

TX-> Transacción

Id1 e id2 son números que son diferentes para diferentes tipos de recursos

Al igual que para table lock (TM), se escribe como

TM--0

Cuando un usuario solicita acceso al recurso en cierto modo, se genera un identificador en cola que se explicó anteriormente

Enqueue se mantienen en este modo

SS:modo de compartir fila

SX:modo exclusivo de fila

S:  Bloquear la mesa en modo compartido

SSX:bloquear la mesa en modo compartido y fila en modo exclusivo

X:Bloquea la mesa en modo exclusivo

¿Qué es el recurso Enqueue?

Cada puesta en cola se mantiene a través de una estructura de recursos por parte del servidor de Oracle y se identifica como se explicó anteriormente. Una estructura de recursos tiene tres listas

  1. Lista de propietarios
  2. Lista de espera
  3. Lista de convertidores

Cuando un usuario solicita un bloqueo en un recurso en cierto modo, obtiene una estructura de bloqueo y realiza una solicitud para adquirir el bloqueo en cierto recurso. Se coloca en estas listas de la estructura de recursos según el bloqueo requerido.

Entonces, el usuario primero solicita ese recurso, luego se colocará en la lista de propietarios

La estructura de recursos se obtiene de la tabla de recursos y la estructura de bloqueo se obtiene de la tabla de bloqueo. Ambos se asignan en SGA

El número de filas en la tabla de recursos está definido por el parámetro de inicialización enqueue_resources. Los valores en uso se pueden ver en v$resource view

El número de filas en la tabla de estructura de bloqueo se define mediante el parámetro de inicialización _enqueue_locks. Los valores en uso se pueden ver en v$enqueue_lock

¿Cómo se realiza la búsqueda en la tabla de recursos?

  • La tabla de recursos contiene toda la estructura de recursos. Se utiliza un algoritmo hash para encontrar y acceder a la estructura de recursos en la tabla de recursos.
  • La tabla de recursos está organizada en cubo hash. Cada depósito hash contiene una lista de estructuras de recursos en forma de lista vinculada.
  • Cuando se busca el recurso, su hash se obtiene usando un algoritmo de hash y luego se obtiene el latch para encontrar el cubo de hash correspondiente y luego el recurso se busca en la lista en el cubo de hash. Si se encuentra el recurso, se obtiene la estructura de bloqueo y la solicitud se coloca en propietario, servidor y lista de conversión según el nivel especificado de bloqueo solicitado

Ejemplo TM-575-0 recurso hash en el depósito 1, se obtiene una cadena hash de encolado con pestillo para acceder al depósito hash y se accede a la lista en el depósito para obtener la estructura del recurso

  • Si el recurso no se encuentra en la lista de deseos y se obtiene una nueva estructura de recursos de la lista libre de recursos y se coloca en la lista de deseos. Esto sucede bajo el pestillo Enqueue. También se asigna una estructura de bloqueo

La solicitud de bloqueo se coloca en la lista de propietarios de la estructura de recursos

¿Cómo funcionan las operaciones de puesta en cola?

Cuando un usuario solicita un bloqueo en el recurso, el servidor de Oracle hace lo siguiente

  • Si actualmente no es propiedad, el recurso se otorga al usuario
  • Si es propiedad y hay camareros y convertidor, entonces se coloca al final de la cola de camareros
  • Si es propiedad, pero no hay un servidor ni un convertidor, entonces si es compatible con el bloqueo del propietario, se concede la solicitud. Si no es compatible, se coloca en la lista de espera
  • Se permite que un convertidor continúe si la solicitud es menos restrictiva que el bloqueo que se tiene actualmente o si el modo solicitado es compatible con el bloqueo que tiene el otro propietario
  • Se permite que un servidor continúe si la lista de convertidores está vacía, no hay servidores delante y el bloqueo solicitado es compatible con el bloqueo que tiene actualmente
  • El convertidor siempre se procesa antes que los camareros.
  • El servidor de Oracle comprueba estas colas cada vez que se libera o convierte el bloqueo.

Cómo se verifica la cola cuando se libera o convierte el bloqueo de Oracle

  • Los procesos que esperan los recursos duermen en los semáforos, y los semáforos se utilizan como mecanismos de suspensión/activación. Después de ingresar a la cola, el proceso de solicitud dormirá en el semáforo usando la llamada sync_op.

sincronización_op(SYNC_WAIT, SYNCF_BINARY, 300) =1

  • Una vez que el proceso que contiene el recurso está listo para liberarlo, mira la cola adjunta a la estructura del recurso. Si hay un proceso en la cola, envía una señal de semáforo al proceso en espera mediante

llamada sync_op.

sincronización_op(0x0005, SYNCF_BINARY, 134491620) =1

  • El proceso de espera manejará la señal y se despertará. Este proceso de espera modifica el estado según los pasos dados en la operación de puesta en cola

Tipos comunes de puesta en cola

JQ:cola de trabajos. Cuando se ejecuta un trabajo (enviado por DBMS_JOB.SUBMIT), está protegido por una cola JQ (lo que significa que solo un proceso SNP puede ejecutar el trabajo).

ST:Transacción de gestión de espacios . La puesta en cola de ST debe realizarse cada vez que la sesión asigna/desasigna extensiones (lo que significa que desea cambiar las tablas de diccionario UET$ y FET$), como fusión, eliminación/truncamiento de segmentos y clasificación de disco. Si la sesión obtiene un tiempo de espera cuando solicita la puesta en cola de ST, se devuelve "ORA-1575 tiempo de espera para la gestión del espacio".

TM – DML (Tabla)  en cola. Cada vez que una sesión quiere bloquear una tabla, se solicita una cola de TM. Si una sesión elimina una fila en la tabla principal (DEPT) y se crea una restricción de referencia (clave externa) sin un índice en la tabla secundaria (EMP), o si la sesión está actualizando la(s) columna(s) que referencias clave a continuación, se toma un bloqueo compartido (nivel 4) en la tabla secundaria. Si otra sesión intenta hacer cambios en la tabla secundaria, tiene que esperar (porque quiere poner en cola en modo exclusivo de fila, y eso no es compatible con el modo compartido). Si se crea un índice en la columna de clave externa de la tabla secundaria, no se requiere ningún bloqueo compartido en la tabla secundaria.

TX:transacción. Tan pronto como se inicia una transacción, se necesita una cola de TX. Una transacción se define únicamente por el número de segmento de reversión, el número de ranura en la tabla de transacciones del segmento de reversión y el número de secuencia del número de ranura. Una sesión puede estar esperando en una cola de TX por varios motivos:

1) Otra sesión está bloqueando la fila solicitada.

2) Cuando dos sesiones intentan insertar la misma clave única en una tabla (ninguna de ellas ha realizado un COMMIT), entonces la última sesión está esperando que la primera se COMMIT o ROLLBACK.

3) No hay ITL (Lista de transacciones interesadas) libres en el encabezado del bloque (aumente INI_TRANS och PCT_FREE para el segmento).

UL:bloqueo de usuario . Una sesión se ha bloqueado con la función DBMS_LOCK.REQUEST.

Vistas y tabla para ver la puesta en cola de Oracle y los bloqueos de Oracle

V$sesión y v$sesión_espera

Cuando una sesión está esperando en cola o bloqueada, puede ser una sesión de V$session (en 11g y superior) y v$session_wait

Select * from v$session_wait where event like ‘enq%’;

The parameter of the enqueue wait event   has following meaning

P1: resource type and mode wanted

P2:ID1 of the resource

P3: ID2 of the resource

Podemos usar la siguiente consulta para obtener toda la cola en el sistema

Select event,p1, p2,p3 from v$session_wait  where wait_time=0 and event like 'enq%';
  1. V$lock es otra vista útil para comprobar la puesta en cola
  2. V$lock enumera toda la estructura de bloqueo que se encuentra actualmente en el sistema
  3. El tipo de columna, id1 e id2 representan el tipo de recurso , id1 e id2 de la estructura del recurso, por lo que se puede unir con V$resource que contiene la lista de toda la estructura del recurso
  • LMODE y la solicitud nos dicen qué cola (propietario, convertidor, camareros) es la sesión
MODOL Solicitud Nombre de cola
> 0 =0 Propietario
=0 > 0 Camarero
> 0    >  0 Convertidor

La siguiente consulta se puede utilizar para encontrar el titular y el camarero

SELECT inst_id,DECODE(request,0,'Holder: ','Waiter: ')||sid sess,
id1, id2, lmode, request, type
FROM V$LOCK
WHERE (id1, id2, type) IN
(SELECT id1, id2, type FROM V$LOCK WHERE request>0)
ORDER BY id1, request
;

En el caso de RAC, la siguiente consulta podría usarse para encontrar bloqueadores y esperas

SELECT inst_id,DECODE(request,0,'Holder: ','Waiter: ')||sid sess,
id1, id2, lmode, request, type
FROM GV$LOCK
WHERE (id1, id2, type) IN
(SELECT id1, id2, type FROM gV$LOCK WHERE request>0)
ORDER BY id1, request
;

V$objeto_bloqueado

es otra vista útil para los bloqueos de tablas de Oracle

Contiene todos los bloqueos de TM en la base de datos. Proporciona la ranura de transacción, el proceso del sistema operativo y la identificación de la sesión que contiene los bloqueos de TM

Hay varias vistas que se pueden utilizar para encontrar la información de bloqueos. Estas vistas son creadas por catblock.sql

DBA_LOCKS Mostrar todos los bloqueos como v$lock
DBA_DML_LOCKS Muestra todos los bloqueos DML™ retenidos o solicitados
DBA_DDL_LOCKS Muestra todos los bloqueos DDL retenidos o solicitados
DBA_CAMAREROS Muestra todas las sesiones en espera, pero no en espera de bloqueos
DBA_BLOQUEADORES Muestra sesiones que no están en espera con bloqueos en espera

Consulta para averiguar la sesión de espera y la celebración de sesiones en Oracle 

set linesize 1000
column waiting_session heading 'WAITING|SESSION'
column holding_session heading 'HOLDING|SESSION'
column lock_type format a15
column mode_held format a15
column mode_requested format a15
select
waiting_session,
holding_session,
lock_type,
mode_held,
mode_requested,
lock_id1,
lock_id2
from
dba_waiters
/

Consulta para averiguar todos los objetos bloqueados

set term on;
set lines 130;
column sid_ser format a12 heading 'session,|serial#';
column username format a12 heading 'os user/|db user';
column process format a9 heading 'os|process';
column spid format a7 heading 'trace|number';
column owner_object format a35 heading 'owner.object';
column locked_mode format a13 heading 'locked|mode';
column status format a8 heading 'status';
select
substr(to_char(l.session_id)||','||to_char(s.serial#),1,12) sid_ser,
substr(l.os_user_name||'/'||l.oracle_username,1,12) username,
l.process,
p.spid,
substr(o.owner||'.'||o.object_name,1,35) owner_object,
decode(l.locked_mode,
1,'No Lock',
2,'Row Share',
3,'Row Exclusive',
4,'Share',
5,'Share Row Excl',
6,'Exclusive',null) locked_mode,
substr(s.status,1,8) status
from
v$locked_object l,
all_objects     o,
v$session       s,
v$process       p
where
l.object_id = o.object_id
and l.session_id = s.sid
and s.paddr      = p.addr
and s.status != 'KILLED'
/

Cómo se manejan los bloqueos DML en el servidor de Oracle

Cuando se ejecuta una actualización, inserción, eliminación o selección de actualización en la tabla de Oracle, Oracle toma estos dos bloqueos

  • Bloqueo de tabla DML:para garantizar la consistencia de la definición de objeto durante la transacción. Esto evita que se produzcan operaciones DDL mientras hay un DML en curso.
  • Bloqueo de fila DML:esto es para garantizar la coherencia de los datos durante la ejecución de la transacción. Podemos reformular como Esto obtiene un bloqueo en la fila en particular que se toca y cualquier otra transacción que intente modificar la misma fila se bloquea, hasta que finaliza la que ya la posee

Cómo se implementan los bloqueos de tablas de Oracle

Ya explicamos la infraestructura de Enqueue en el apartado anterior. Bloqueos de tablas de Oracle se implementan como TM Enqueue

Entonces la estructura Enqueue sería

TM- -0

Los modos son

RS:compartir fila

RX:fila exclusiva

S:compartir

SRX:compartir fila exclusiva

X:exclusivo

Cada cursor mantiene una lista de estructura de bloqueo de tabla que se construye mientras se analiza la declaración. Tras la primera ejecución, se realiza una llamada de función para bloquear todas las tablas de la lista. Los bloqueos se liberan cuando la transacción se confirma o retrocede.

La posibilidad de retroceder, particularmente retroceder a un punto de guardado, agrega otra dimensión de complejidad al bloqueo del diccionario. Es decir, si una transacción se revierte más allá del punto en el que se actualizó un bloqueo, entonces el bloqueo se debe degradar correspondientemente, como parte de la operación de reversión, para reducir el riesgo de interbloqueos artificiales.

Los requisitos de bloqueo de diccionario para transacciones y, en particular, el mantenimiento de un historial de conversiones de bloqueo, los proporcionan los bloqueos DML junto con TM enqueue. Cada transacción que tiene un bloqueo DML también tiene un bloqueo de puesta en cola de TM. La función básica de bloqueo la proporciona la puesta en cola, y el bloqueo DML agrega el mantenimiento del historial de conversión.

La matriz fija de estructuras de bloqueo DML está dimensionada por el parámetro DML_LOCKS. Su lista libre está protegida por el pestillo de asignación de bloqueo dml, y las ranuras activas son visibles en V$LOCKED_OBJECT.

Para configurar los DML_LOCK, verifique la utilización en v$resource_limit. Podemos configurarlo generosamente ya que ocupa muy poco espacio

¿Cómo desactivar los bloqueos de mesa?

  • Los bloqueos DML y los bloqueos de puesta en cola de TM asociados se pueden deshabilitar, ya sea por completo o solo para ciertas tablas.
  • Para deshabilitar estos bloqueos por completo, el parámetro DML_LOCKS debe establecerse en cero. En una base de datos de servidor paralelo, debe establecerse en cero en todas las instancias.
  • Para deshabilitar tales bloqueos contra una tabla en particular, se debe usar la cláusula DISABLE TABLE LOCKS de la instrucción ALTER TABLE.
  • Si los bloqueos están deshabilitados para una tabla, las declaraciones DML aún pueden modificar los bloques de la tabla y los bloqueos a nivel de fila aún se mantienen. Sin embargo, los bloqueos de tabla de modo subcompartido normalmente asociados con consultas y los bloqueos de tabla de modo subexclusivo normalmente asociados con DML no se toman. En su lugar, las transacciones en la tabla están protegidas contra DDL en conflicto simplemente prohibiendo todos los intentos de bloquear la tabla completa y, por lo tanto, todos los DDL en la tabla.
  • Deshabilitar los bloqueos de tabla puede aumentar el rendimiento, ya que se reduce la sobrecarga de adquisición de bloqueos. Esto es particularmente importante en el caso de RAC, donde esta sobrecarga es bastante alta.
  • La desactivación de los bloqueos de tablas también evita la creación de índices de claves foráneas. Como clave externa, debe indexarse ​​para evitar el bloqueo de la tabla secundaria mientras las filas se manipulan en la tabla principal. Entonces, si deshabilitamos el bloqueo de tablas todos juntos, no se requieren índices
  • Es preferible usar alter table para deshabilitar los bloqueos de tabla en alguna tabla y luego establecer la tabla dml_locks. Como si dml_locks estuviera configurado en cero, necesitaremos rebotar la instancia para configurarlo nuevamente
  • En la inserción de carga directa, una sesión tomará la TM en cola en modo 'X'. Esto evita que se produzca cualquier otro DML mientras se realiza la carga directa, además de bloquear todos los DDL

Cómo se implementan los bloqueos de fila DML

Los bloqueos de fila DML se implementan como una combinación de las siguientes dos cosas

  1. Bloqueo de nivel de fila:se implementa como byte de bloqueo en cada encabezado de fila e ITL (lista de transacciones interesadas) en cada bloque de datos o índice. Estos no se almacenan en caché en ningún lugar y, dado que se almacenan en el propio bloque, no en SGA, que es limitado, este mecanismo de bloqueo de Oracle es enormemente escalable
  2. Bloqueos de transacciones:estos se implementan como TX Enqueue

El byte de bloqueo apunta a la entrada de ITL en el bloque y Todas las entradas de ITL para la transacción apuntan a TX Enqueue, que finalmente determina si la transacción se confirma o se revierte. Los camareros esperarán en el bloqueo de transacciones

Ejemplo

  • Una transacción A quiere actualizar las filas 2 y 3 del bloque. Asignará una ITL (lista de transacciones interesadas). La transacción accede a las filas 2 y 3 y ve el byte de bloqueo. Si el byte de bloqueo es cero, no está bloqueado. La transacción actualizará la fila 3 ,3
  • Ahora comienza una transacción B   y quiere actualizar las filas 1 . Asignará una ITL (lista de transacciones interesadas). La transacción accede a la fila 1 y ve el byte de bloqueo. Si el byte de bloqueo es cero, no está bloqueado. La transacción actualizará la fila 1
  • Ahora la transacción quiere actualizar la fila 2. Accederá a la fila y la encontrará bloqueada porque el byte de bloqueo no será cero. Se verá en la ITL que contiene el candado. Realizará una limpieza de ITL para averiguar si la transacción está activa o no. En este caso, encontrará la Transacción A activa. Entonces, la transacción B tiene que esperar a que la transacción A se revierta o confirme. La transacción B esperará al exigir el TX Enqueue que la transacción A mantiene en modo exclusivo

¿Qué es la lista de transacciones interesadas (ITL)

Cuando una sesión quiere modificar un bloque, tiene que asignar un ITL en el bloque. ITL es la estructura de datos en el encabezado del bloque que contiene muchas ranuras que son ocupadas por la transacción. Se define por el parámetro INITRANS y MAXTRANS cuando se crea la tabla. Los números iniciales de ranuras se crean según INITTRANS y crecen dinámicamente hasta el máximo de MAXTRANS

¿Qué es una transacción?

Cuando se actualiza/elimina/inserta una sesión, se inicia una transacción. Se completa cuando se produce la confirmación o la reversión. Una transacción se identifica mediante el identificador de transacción (XID). La transacción identifica consta de tres partes

  1. Retroceder o deshacer número de segmento
  2. Número de ranura de la tabla de transacciones
  3. Secuenciar o envolver no

XID=usn#.slot#.wrap#

Cada bloque ITL contendrá el XID

Una limpieza de ITL significa buscar el XID en el ITL y buscar los segmentos de reversión en función de esto y buscar la tabla de transacciones y el número de ajuste para verificar la actividad de la transacción.

Podemos usar el siguiente comando para volcar cualquier segmento de reversión

Alterar volcado de sistema deshacer encabezado ;

Cada transacción activa se puede ver en la tabla de transacciones v$

select addr, xidusn, xidslot, xidsqn
from v$transaction;
ADDR         XIDUSN    XIDSLOT     XIDSQN
-------- ---------- ---------- ----------
3C485875         50         5      3000

El Identificador de transacción (XID) también se puede obtener en la propia sesión usando

select dbms_transaction.local_transaction_id from dual;

La espera en TX enq se verá en v$session_wait

P1:Nombre|modo

P2:rbs3|envolver#

P3:ranura#

Para resumir los bloqueos de fila DML

El primer DML en una sesión donde aún no existe una transacción creará implícitamente una transacción.

  • Se asignará un número de segmento de deshacer, un espacio y un ajuste
  • Se creará una instancia de TX en cola

Cuando se identifica una fila a modificar, la sesión tomará una entrada en el ITL del bloque de datos, lo asignará a la transacción

  • USN/SLOT/WRAP se escribirá en el espacio ITL, reservando ese espacio para la transacción actual
  • Se bloqueará la fila configurando el byte de bloqueo en el directorio de la fila para que apunte a la ranura ITL de la transacción actual

Tanto TM como TX Enqueue se pueden ver en V$lock

  • El tipo identifica TM o TX
  • ID1 e ID2 pueden contener información adicional, pero son sensibles al contexto con respecto al TIPO de puesta en cola
  • Para la puesta en cola de TM, ID1 es el OBJECT_ID del objeto que se está bloqueando, al que se puede hacer referencia en DBA_OBJECTS, e ID2 siempre es 0
  • Para TX Enqueue, ID1 e ID2 contienen el número de segmento de deshacer, el número de ranura y el ajuste

Ejemplo detallado para explicar el funcionamiento de las cerraduras de Oracle

  • Crear la tabla ficticia
Create table from j as select * from dba_objects where rownum < 3;

Table created

 Create table from j1 as select * from dba_objects where rownum < 3;

Table created
  • Sesión A
Select * from j for update;

Veamos qué está presente en v$lock

SQL> select distinct sid from v$mystat;

 SID
----------
2125

SQL> select * from v$lock where sid=2125;
ADDR             KADDR                   SID TY        ID1        ID2      LMODE
---------------- ---------------- ---------- -- ---------- ---------- ----------
REQUEST      CTIME      BLOCK
---------- ---------- ----------
00000006B5D9D0D0 00000006B5D9D148       2125 TX    2883613   16425600          6

0         44          0
FFFFFFFF7DA4B360 FFFFFFFF7DA4B3C0       2125 TM   21488781          0          3

0         44          0


Entonces vemos aquí

Se crea el bloqueo de tabla DML Oracle

Se crea TX (bloqueo de transacción)

  • Comencemos la sesión B
SQL>Select * from j1 for update;

SQL > select distinct sid from v$mystat;

 SID
----------
2302
SQL> select * from v$lock where sid=2302;

ADDR             KADDR                   SID TY        ID1        ID2      LMODE
---------------- ---------------- ---------- -- ---------- ---------- ----------
REQUEST      CTIME      BLOCK
---------- ---------- ----------
00000006AF7FF910 00000006AF7FF988       2302 TX    2949148   16884039          6

0         10          0
FFFFFFFF7DA4B360 FFFFFFFF7DA4B3C0       2302 TM      33544          0          3

0         10          0

00000006DC289D60 00000006DC289DB8       2302 AE   15062272          0          4

0        106          0

Entonces vemos aquí

Se crea un bloqueo de tabla DML

Se crea TX (bloqueo de transacción)

Ahora intentemos hacer

Select * from j for update;

Esto colgará

  • Comencemos otra sesión para analizar el problema

Si ve los detalles de la sesión sid =2032 en V$lock

select * from v$lock where sid=2302;
ADDR             KADDR                   SID TY        ID1        ID2      LMODE
---------------- ---------------- ---------- -- ---------- ---------- ----------
REQUEST      CTIME      BLOCK
---------- ---------- ----------
FFFFFFFF7DA4B360 FFFFFFFF7DA4B3C0       2302 TM      33544          0          3
0         47          0

00000006DC289D60 00000006DC289DB8       2302 AE   15062272          0          4
0        143          0

00000006DC289808 00000006DC289860       2302 TX    2883613   16425600          0
         6          7          0

FFFFFFFF7DA4B360 FFFFFFFF7DA4B3C0       2302 TM   21488781          0          3
0          7          0

La fila en negrita es la solicitud 6 (bloqueo exclusivo) en alguna consulta de TX

Ahora podemos usar la siguiente consulta para encontrar la sesión de bloqueo

select l1.sid, ' IS BLOCKING ', l2.sid
from v$lock l1, v$lock l2
where l1.block =1 and l2.request > 0
and l1.id1=l2.id1
and l1.id2=l2.id2
SID 'ISBLOCKING'         SID
---------- ------------- ----------
2125  IS BLOCKING        2302

Ahora podemos confirmar o revertir la sesión 2125 para que la transacción B continúe. Podemos cerrar la sesión 2125 usando el siguiente comando también para liberar el bloqueo

Alter system kill session ‘2125,<serial>’;

Más información adicional

Los bloqueos de TX en v$lock no le indican a la información de la fila dónde está presente la contención. Podemos ver esas cosas usando las consultas

La siguiente consulta debe ejecutarse desde la sesión que está esperando

SQL> select row_wait_obj#, row_wait_file#, row_wait_block#, row_wait_row#

from v$session where sid=2302

ROW_WAIT_OBJ# ROW_WAIT_FILE# ROW_WAIT_BLOCK# ROW_WAIT_ROW#
------------- -------------- --------------- -------------
21488781            461           81063             0

 

select do.object_name,
row_wait_obj#, row_wait_file#, row_wait_block#, row_wait_row#,
dbms_rowid.rowid_create ( 1, ROW_WAIT_OBJ#, ROW_WAIT_FILE#, ROW_WAIT_BLOCK#, ROW_WAIT_ROW# )
from v$session s, dba_objects do
where sid=2302
and s.ROW_WAIT_OBJ# = do.OBJECT_ID ;  
OBJECT_NAME  ROW_WAIT_OBJ# ROW_WAIT_FILE# ROW_WAIT_BLOCK# ROW_WAIT_ROW# DBMS_ROWID.ROWID_C
------------- -------------- --------------- ------------- ------------------

J
21488781            461           81063             0 ABR+SNAHNAAATynAAA

 

SQL> Select * from j where rowid=’ ABR+SNAHNAAATynAAA’;

Artículos relacionados

Cómo funciona el bloqueo de Oracle
Cómo encontrar los detalles de la sesión en la base de datos de Oracle
Comprobación importante del estado de la base de datos
Preguntas de la entrevista del dba de las aplicaciones de Oracle
Consultas para comprobar bloqueos en la base de datos de Oracle
DBA de Oracle preguntas de la entrevista

Cursos recomendados

Los siguientes son algunos de los cursos recomendados que puede comprar si quiere dar un paso más

Abajo se encuentran los enlaces a algunos de los cursos


Oracle DBA 11g/12c:administración de bases de datos para DBA junior :Este curso es bueno para las personas que están comenzando como DBA Junior o aspiran a ser DBA de Oracle. Esto proporcionará una buena comprensión de las tareas de copia de seguridad y recuperación y de administración general
Oracle Database:Oracle 12C R2 RAC Administration :Este curso cubre la instalación y administración de Oracle RAC. Un buen curso para Oracle DBA que desea actualizar sus habilidades para Oracle RAC
Oracle Data Guard:administración de bases de datos para Oracle 12C R2 :Este curso cubre la instalación y administración de Oracle Dataguard. Un buen curso para Oracle DBA que desea mejorar sus habilidades para Oracle Dataguard