Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Bloqueios Oracle e bloqueios de tabela:como funciona


O banco de dados Oracle é o banco de dados amplamente utilizado na indústria. Aqui estou tentando explicar  sobre bloqueios oracle, bloqueios de tabela oracle

Índice

O que é Oracle Enqueue e bloqueios


Enqueue são bloqueios Oracle que serializam as operações para a estrutura compartilhada. A estrutura compartilhada pode ser tabela, threads de refazer e transações.

Quando um usuário A atualiza uma linha 12 na tabela, ele adquire a transação Enqueue (bloqueio). Isso é adquirido para que qualquer usuário que eu tente atualizar essa mesma linha 12 na tabela espere até que o usuário A confirme a transação. Portanto, agora, se o usuário B tentar atualizar a mesma linha, ele aguardará no enfileiramento.

Uma vez que o usuário A confirma a transação, a transação do usuário B continuará

Temos enfileiramento local no banco de dados de instância única, enquanto no Oracle RAC, temos enfileiramento local e enfileiramento global para gerenciar o recurso compartilhado

O que é identificador de enfileiramento


Enqueue são identificados exclusivamente usando o formato



Recurso pode

TM -> travas de mesa

MR-> Recuperação de mídia

TX-> Transação

Id1 e id2 são números que são diferentes para diferentes tipos de recursos

Como para bloqueio de tabela (TM), é escrito como

TM--0

Quando um usuário solicita acesso ao recurso em determinado modo, um identificador de enfileiramento é gerado, explicado acima

O enfileiramento é mantido neste modo

SS: Modo de compartilhamento de linha

SX:Modo exclusivo de linha

S: Bloquear a mesa no modo de compartilhamento

SSX:Bloqueie a tabela no modo de compartilhamento e a linha no modo exclusivo

X:Bloqueia a mesa no modo exclusivo

O que é recurso de enfileiramento


Cada enfileiramento é mantido por meio de uma estrutura de recursos pelo servidor Oracle e é identificado conforme explicado acima. Uma estrutura de recursos tem três listas
  1. Lista de proprietários
  2. Lista de espera
  3. Lista de conversores

Quando um usuário solicita um bloqueio em um recurso em determinado modo, ele obtém uma estrutura de bloqueio e faz uma solicitação para adquirir o bloqueio em determinado recurso.

Assim, o usuário   está solicitando esse recurso primeiro e, em seguida, ele será colocado na lista de proprietários

A estrutura de recursos é obtida da tabela de recursos e a estrutura de bloqueio é obtida da tabela de bloqueio. Ambos são alocados no SGA

O número de linhas na tabela de recursos é definido pelo parâmetro de inicialização enqueue_resources. Os valores em uso podem ser vistos na visualização v$resource

O número de linhas na tabela de estrutura de bloqueio é definido pelo parâmetro de inicialização _enqueue_locks. Os valores em uso podem ser vistos em v$enqueue_lock

Como é feita a pesquisa na tabela de recursos?

  • A tabela de recursos contém toda a estrutura de recursos. Um algoritmo de hash é usado para localizar e acessar a estrutura de recursos na tabela de recursos.
  • A tabela de recursos é organizada em um bucket de hash. Cada bucket de hash contém uma lista de estrutura de recursos em forma de lista vinculada.
  • Quando o recurso é pesquisado, seu hash é obtido usando algoritmo de hash e, em seguida, é obtido o latch para encontrar o hash bucket correspondente e, em seguida, o recurso é pesquisado na lista no hash bucket. Se o recurso for encontrado, a estrutura de bloqueio será obtida e a solicitação será colocada no proprietário, no garçom e na lista de conversão de acordo com o nível especificado de bloqueio solicitado

Exemplo de recurso TM-575-0 com hash no bucket 1, uma cadeia de hash de enfileiramento de trava é obtida para acessar o bucket de hash e a lista é acessada no bucket para obter a estrutura do recurso
  • Se o recurso não for encontrado na lista de buckets e uma nova estrutura de recursos for obtida da lista de recursos livres e colocada na lista de buckets. Isso acontece na trava Enqueue. Uma estrutura de bloqueio também é alocada

A solicitação de bloqueio é colocada na lista de proprietários da estrutura de recursos

Como funcionam as operações de enfileiramento?


Quando um usuário solicita um bloqueio no recurso, o servidor Oracle faz o seguinte
  • Se não for de propriedade no momento, o recurso será concedido ao usuário
  • Se for de propriedade e houver garçons e conversores, ele será colocado na parte inferior da fila de garçons
  • Se for de propriedade, mas não houver garçom e conversor, se for compatível com o bloqueio de proprietário, a solicitação será concedida. Se não for compatível, será colocado na lista de espera
  • Um conversor tem permissão para prosseguir se a solicitação for menos restritiva do que o bloqueio mantido atualmente ou o modo solicitado for compatível com o bloqueio mantido pelo outro proprietário
  • Um waiter tem permissão para prosseguir se a lista de conversores estiver vazia, não houver waiters à sua frente e o bloqueio solicitado for compatível com o bloqueio atual
  • O conversor é sempre processado antes dos garçons.
  • O servidor Oracle verifica essas filas sempre que o bloqueio é liberado ou convertido.

Como a fila é verificada quando o bloqueio do Oracle é liberado ou convertido

  • Os processos que aguardam os recursos dormem nos semáforos, e os semáforos são usados ​​como mecanismos de sono/despertar. Depois de entrar na fila, o processo solicitante dormirá no semáforo usando a chamada sync_op.

sync_op(SYNC_WAIT, SYNCF_BINARY, 300) =1
  • Quando o processo que contém o recurso está pronto para liberá-lo, ele examina a fila anexada à estrutura do recurso. Se houver um processo na fila, ele envia um sinal de semáforo para o processo em espera usando

chamada sync_op.

sync_op(0x0005, SYNCF_BINARY, 134491620) =1
  • O processo de espera processará o sinal e será ativado. Este processo de espera modifica o status de acordo com as etapas fornecidas na operação de enfileiramento

Tipos comuns de enfileiramento


JQ – Fila de trabalhos. Quando um trabalho (enviado por DBMS_JOB.SUBMIT) está em execução, ele é protegido por um enfileiramento JQ (o que significa que apenas um processo SNP pode executar o trabalho).

ST – Transação de gerenciamento de espaço . O enfileiramento ST precisa ser retido toda vez que a sessão estiver alocando/desalocando extensões (o que significa que deseja alterar as tabelas de dicionário UET$ e FET$), como coalescência, soltar/truncar segmentos e classificação de disco. Se a sessão obtiver um tempo limite ao solicitar o enfileiramento ST, será retornado "Tempo limite ORA-1575 aguardando gerenciamento de espaço".

TM – DML (Tabela)  enfileirado. Toda vez que uma sessão deseja bloquear uma tabela, um enfileiramento de TM é solicitado. Se uma sessão excluir uma linha na tabela-pai (DEPT) e uma restrição referencial (chave estrangeira) for criada sem um índice na tabela-filho (EMP), ou se a sessão estiver atualizando a(s) coluna(s) que a referências de chave para um bloqueio de compartilhamento (nível 4)  é obtido na tabela filha. Se outra sessão tentar fazer alterações na tabela-filho, eles terão que esperar (porque desejam o enfileiramento no modo exclusivo de linha e isso não é compatível com o modo de compartilhamento). Se um índice for criado na coluna de chave estrangeira da tabela filha, nenhum sharelock será necessário na tabela filha.

TX – Transação. Assim que uma transação é iniciada, um enfileiramento TX é necessário. Uma transação é definida exclusivamente pelo número do segmento de rollback, o número do slot na tabela de transações do segmento de rollback e o número de sequência do número do slot. Uma sessão pode estar esperando em um enfileiramento TX por vários motivos:

1) Outra sessão está bloqueando a linha solicitada.

2) Quando duas sessões tentam inserir a mesma chave única em uma tabela (nenhuma delas fez um COMMIT), então a última sessão está esperando pela primeira para COMMIT ou ROLLBACK.

3) Não há ITL (Interested Transaction List) livre no cabeçalho do bloco (aumento de INI_TRANS ou PCT_FREE para o segmento).

UL – Bloqueio de usuário . Uma sessão foi bloqueada com a Função DBMS_LOCK.REQUEST.

Visualizações e Tabela para visualizar o enfileiramento e bloqueios Oracle

V$session e v$session_wait


Quando a sessão está aguardando enfileiramento ou bloqueio, pode ser sessão de V$session (em 11g e superior) e 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 a consulta abaixo para obter todo o enfileiramento no sistema
Select event,p1, p2,p3 from v$session_wait  where wait_time=0 and event like 'enq%';
  1. V$lock é outra visualização útil para verificar enqueue 's
  2. V$lock lista toda a estrutura de bloqueio atualmente mantida no sistema
  3. O tipo de coluna ,id1 e id2 representam o tipo de recurso  ,id1 e id2 da estrutura do recurso. Assim, ela pode ser unida a V$resource que contém a lista de toda a estrutura do recurso
  • LMODE e solicitação nos informam qual fila (proprietário, conversor, garçons) é a sessão
LMODE Solicitar Nome da fila
> 0 =0 Proprietário
=0 > 0 Garçom
> 0    >  0 Conversor

A consulta abaixo pode ser usada para encontrar o titular e o garçom
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
;

No caso de RAC, a consulta abaixo pode ser usada para descobrir bloqueadores e garçons
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$locked_object


é outra visualização útil para bloqueios de tabela Oracle

Ele contém todos os bloqueios de TM no banco de dados. Ele fornece o slot de transação, o processo do sistema operacional e o id da sessão que está mantendo os bloqueios da TM

Existem várias visualizações que podem ser usadas para localizar as informações de bloqueios. Essas visualizações são criadas por catblock.sql
DBA_LOCKS Mostrar todos os bloqueios como v$lock
DBA_DML_LOCKS Mostra todos os bloqueios DML™ mantidos ou sendo solicitados
DBA_DDL_LOCKS Mostra todos os bloqueios DDL mantidos ou sendo solicitados
DBA_WAITERS Mostra todas as sessões aguardando, mas não aguardando bloqueios
DBA_BLOCKERS Mostra sessões sem espera com bloqueios em espera

Consulte para descobrir sessões em espera e em espera no 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
/


Consulte para descobrir todos os 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'
/

Como os bloqueios DML são tratados no servidor Oracle


Quando um update, insert, delete ou select for update é executado na tabela oracle, o Oracle pega esses dois locks
  • Bloqueio de Tabela DML:Para garantir a consistência da definição do objeto durante a transação. Isso evita que qualquer operação DDL ocorra enquanto uma DML está em andamento.
  • DML Row Lock:Isso é para garantir a consistência dos dados durante a execução da transação. Podemos reformular como Isso obtém um bloqueio na linha específica que está sendo tocada e qualquer outra transação que tente modificar a mesma linha é bloqueada, até que a que já a possui termine

Como os bloqueios de tabela Oracle são implementados


Já explicamos a infraestrutura do Enqueue na seção anterior. Bloqueios de tabela Oracle são implementados como TM Enqueue

Portanto, a estrutura de enfileiramento seria

TM- -0

Os modos são

RS:compartilhamento de linha

RX:linha exclusiva

S:compartilhar

SRX:compartilhar linha exclusiva

X:exclusivo

Cada cursor mantém uma lista de estrutura de bloqueio de tabela que é construída durante a análise da instrução. Na primeira execução, a chamada de função é feita para bloquear toda a tabela da lista. Os bloqueios são liberados quando a transação é confirmada ou revertida.

A possibilidade de reversão, particularmente reversão para um ponto de salvamento, adiciona outra dimensão de complexidade ao bloqueio de dicionário. Ou seja, se uma transação for revertida além do ponto em que um bloqueio foi atualizado, o bloqueio deverá ser rebaixado correspondentemente, como parte da operação de reversão, para reduzir o risco de deadlocks artificiais.

Os requisitos de bloqueio de dicionário para transações e, em particular, a manutenção de um histórico de conversões de bloqueio, são fornecidos por bloqueios DML em conjunto com o enfileiramento de TM. Cada transação que contém um bloqueio DML também contém um bloqueio de enfileiramento TM. A funcionalidade básica de bloqueio é fornecida pelo enfileiramento e o bloqueio DML adiciona a manutenção do histórico de conversão.

A matriz fixa de estruturas de bloqueio DML é dimensionada pelo parâmetro DML_LOCKS. Sua lista livre é protegida pela trava de alocação de bloqueio dml e os slots ativos são visíveis em V$LOCKED_OBJECT .

Para definir os DML_LOCKs verifique a utilização em v$resource_limit. Podemos configurá-lo generosamente, pois ocupa muito menos espaço

Como desativar os bloqueios de tabela?

  • Os bloqueios DML e os bloqueios de enfileiramento de TM associados podem ser desativados, totalmente ou apenas para determinadas tabelas.
  • Para desativar totalmente esses bloqueios, o parâmetro DML_LOCKS deve ser definido como zero. Em um banco de dados de servidor paralelo, deve ser definido como zero em todas as instâncias.
  • Para desabilitar esses bloqueios em uma tabela específica, a cláusula DISABLE TABLE LOCKS da instrução ALTER TABLE deve ser usada.
  • Se os bloqueios estiverem desabilitados para uma tabela, as instruções DML ainda poderão modificar os blocos da tabela e os bloqueios em nível de linha ainda serão mantidos. No entanto, os bloqueios de tabela de modo subcompartilhado normalmente associados a consultas e os bloqueios de tabela de modo subexclusivo normalmente associados a DML não são usados. Em vez disso, as transações contra a tabela são protegidas contra DDL conflitantes simplesmente proibindo todas as tentativas de bloquear a tabela inteira e, portanto, todos os DDL contra a tabela.
  • Desativar os bloqueios de tabela pode aumentar o desempenho, pois a sobrecarga de aquisição de bloqueio é reduzida   Isso é particularmente importante no caso de RAC, onde essa sobrecarga é bastante alta.
  • Desabilitar os bloqueios de tabela também impede a criação de índices de chave estrangeira. Como a chave estrangeira precisa ser indexada para evitar o bloqueio da tabela filho enquanto as linhas são manipuladas na tabela pai. Portanto, se desabilitarmos o bloqueio de tabela todos juntos, os índices não serão necessários
  • É preferível usar alter table para desabilitar os bloqueios de tabela em alguma tabela do que definir a tabela dml_locks. Como se dml_locks estivesse definido como zero, precisaremos devolver a instância para defini-la novamente
  • Na inserção de carga direta, uma sessão levará o enfileiramento de TM no modo 'X'. Isso evita que qualquer outro DML ocorra enquanto o carregamento direto está acontecendo, além de bloquear todos os DDL

Como os bloqueios de linha DML são implementados


Os bloqueios de linha DML são implementados como uma combinação das seguintes duas coisas
  1. Bloqueio de nível de linha:é implementado como byte de bloqueio em cada cabeçalho de linha e ITL (lista de transações de interesse) em cada bloco de dados ou índice. Eles não são armazenados em cache em nenhum lugar e, como são armazenados no próprio bloco, não no SGA, que é limitado, esse mecanismo de bloqueio por oráculo é altamente escalável.
  2. Bloqueios de transação:são implementados como TX Enqueue

O byte de bloqueio aponta para a entrada ITL no bloco e Todas as entradas ITL para a transação apontam para o TX Enqueue que, em última análise, determina se a transação foi confirmada ou revertida. Os garçons aguardarão o bloqueio da transação

Exemplo
  • Uma transação A deseja atualizar as linhas 2 e 3 do bloco. Ele alocará um ITL (lista de transações interessadas). A transação acessa as linhas 2 e 3 e vê o byte de bloqueio. Se o byte de bloqueio for zero, ele não está bloqueado. A transação atualizará a linha 3 ,3
  • Agora, uma transação B começa   e deseja atualizar as linhas 1 . Ele alocará um ITL (lista de transações interessadas). A transação acessa a linha 1 e vê o byte de bloqueio. Se o byte de bloqueio for zero, ele não será bloqueado. A transação atualizará a linha 1
  • Agora a transação deseja atualizar a linha 2. Ela acessará a linha e a encontrará bloqueada, pois o byte de bloqueio não será zero. Ele procurará no ITL que mantém o bloqueio. Ele executará a limpeza ITL para descobrir se a transação está ativa ou não ativa. Neste caso, ele encontrará a Transação A ativa. Portanto, a transação B precisa aguardar a transação A para reverter ou confirmar. A transação B aguardará para exigir o TX Enqueue que a transação A detém em modo exclusivo

O que é a lista de transações de interesse (ITL)


Quando uma sessão deseja modificar um bloco, ela deve alocar um ITL no bloco. ITL é a estrutura de dados no cabeçalho do bloco que contém muitos slots que são ocupados pela transação. É definido pelos parâmetros INITRANS e MAXTRANS quando a tabela é criada. Números iniciais de slots são criados conforme INITTRANS e crescem dinamicamente até o máximo de MAXTRANS

O que é transação?


Quando uma sessão é atualizada/excluída/inserida , uma transação é iniciada. Ele é concluído quando o commit ou rollback aconteceu. Uma transação é identificada pelo identificador de transação (XID). A transação identifica consiste em três partes
  1. Reverter ou desfazer o número do segmento
  2. Número do slot da tabela de transações
  3. Nº de sequência ou envoltório

XID=usn#.slot#.wrap#

Cada bloco ITL conterá o XID

Uma limpeza de ITL significa procurar o XID no ITL e pesquisar os segmentos de rollback com base nisso e procurar a tabela de transações e o número de encapsulamento para verificar a atividade da transação.

Podemos usar o comando abaixo para despejar qualquer segmento de reversão

Alterar cabeçalho de desfazer de despejo do sistema ;

Cada transação ativa pode ser vista na tabela v$transaction
select addr, xidusn, xidslot, xidsqn
from v$transaction;
ADDR         XIDUSN    XIDSLOT     XIDSQN
-------- ---------- ---------- ----------
3C485875         50         5      3000


O identificador de transação (XID) também pode ser obtido na própria sessão usando
select dbms_transaction.local_transaction_id from dual;


A espera no TX enq será vista em v$session_wait

P1:Nome|modo

P2:rbs3| wrap#

P3:slot#

Para resumir os bloqueios de linha DML

O primeiro DML em uma sessão em que uma transação ainda não existe criará implicitamente uma transação.
  • Um número de segmento de desfazer, slot e wrap serão atribuídos
  • O enfileiramento TX será instanciado

Quando uma linha a ser modificada for identificada, a sessão tomará uma entrada no ITL do bloco de dados, atribuindo-a à transação
  • USN/SLOT/WRAP serão gravados no slot ITL, reservando esse slot para a transação atual
  • O bloqueio será feito na linha, definindo o byte de bloqueio no diretório da linha para apontar para o slot ITL da transação atual

Tanto o TM quanto o TX Enqueue podem ser vistos em V$lock
  • O tipo identifica TM ou TX
  • ID1 e ID2 podem conter informações adicionais, mas são sensíveis ao contexto em relação ao TIPO de enfileiramento
  • Para o enqueue de TM, ID1 é o OBJECT_ID do objeto que está sendo bloqueado, que pode ser referenciado em DBA_OBJECTS, e ID2 é sempre 0
  • Para TX Enqueue, ID1 e ID2 mantêm o número do segmento de desfazer, o número do slot e o wrap

Exemplo detalhado para explicar o funcionamento das fechaduras oracle

  • Crie a tabela fictícia
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
  • Sessão A
Select * from j for update;

Vamos ver o que está presente no 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



Então, vemos aqui

O bloqueio de tabela DML Oracle é criado

TX (bloqueio de transação) é criado
  • Vamos iniciar a sessão 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


Então, vemos aqui

O bloqueio de tabela DML é criado

TX (bloqueio de transação) é criado

Agora vamos tentar fazer
Select * from j for update;

Isso vai travar
  • Vamos iniciar outra sessão para analisar o problema

Se você vir o sid da sessão =2032 detalhes em 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


A linha em negrito é a solicitação 6 (bloqueio exclusivo) em algum TX enq

Agora podemos usar a consulta abaixo para encontrar a sessão de bloqueio
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


Agora podemos confirmar ou reverter a sessão 2125 para que a transação B continue. Podemos matar a sessão 2125 usando o comando abaixo também para liberar o bloqueio
Alter system kill session ‘2125,<serial>’;


Algumas informações adicionais

Os bloqueios TX em v$lock não informam as informações da linha em que a contenção está presente. Podemos ver essas coisas usando as consultas

A consulta abaixo precisa ser executada na sessão que está aguardando
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’;

Artigos relacionados

Como funciona o bloqueio do Oracle
Como encontrar detalhes da sessão no banco de dados Oracle
Verificação importante da integridade do banco de dados
perguntas da entrevista do dba de aplicativos oracle
Consultas para verificar bloqueios no banco de dados oracle
dba do oracle Questões de entrevista

Cursos recomendados


A seguir estão alguns dos cursos recomendados que você pode comprar se quiser dar um passo adiante

Abaixo estão os links para alguns dos cursos


Oracle DBA 11g/12c – Administração de Banco de Dados para DBA Junior :Este curso é bom para pessoas que estão começando como DBA Junior ou aspiram ser DBA Oracle. Isso fornecerá uma boa compreensão das tarefas de backup e recuperação e administração geral
Oracle Database:Oracle 12C R2 RAC Administration :Este curso abrange a instalação e administração do Oracle RAC. Um bom curso para DBA Oracle que deseja atualizar suas habilidades para Oracle RAC
Oracle Data Guard:Administração de Banco de Dados para Oracle 12C R2 :Este curso abrange a instalação e administração do Oracle Dataguard. Um bom curso para Oracle DBA que deseja atualizar suas habilidades para Oracle Dataguard