Oracle
 sql >> Database >  >> RDS >> Oracle

Oracle Locks e table lock:come funziona

Il database Oracle è il database ampiamente utilizzato nel settore. Qui sto cercando di spiegare  sui blocchi Oracle, i blocchi dei tavoli Oracle

Sommario

Cos'è Oracle Enqueue and locks

Enqueue sono blocchi Oracle che serializzano le operazioni sulla struttura condivisa. La struttura condivisa potrebbe essere tabella, ripetere thread e transazioni.

Quando un utente A aggiorna una riga 12 della tabella, acquisisce la transazione Enqueue (lock). Questo viene acquisito in modo che qualsiasi utente che tenti di aggiornare la stessa riga 12 nella tabella attenda fino a quando l'utente A non esegue il commit della transazione. Quindi ora se l'utente B tenta di aggiornare la stessa riga, attenderà in coda.

Una volta che l'utente A ha eseguito il commit della transazione, la transazione dell'utente B procederà

Abbiamo l'accodamento locale nel database a istanza singola mentre con Oracle RAC abbiamo l'accodamento locale e l'accodamento globale per gestire la risorsa condivisa

Cos'è l'identificatore di coda

Le code sono identificate in modo univoco utilizzando il formato

La risorsa può

TM -> lucchetti da tavolo

MR-> Recupero dei supporti

TX-> Transazione

Id1 e id2 sono numeri diversi per i diversi tipi di risorse

Come per il blocco della tabella (TM), è scritto come

TM--0

Quando un utente richiede l'accesso alla risorsa in una determinata modalità, viene generato un identificatore di coda come spiegato sopra

Le code vengono mantenute in queste modalità

SS: Modalità di condivisione riga

SX:Modalità riga esclusiva

S: Blocca il tavolo in modalità condivisione

SSX:blocca la tabella in modalità condivisione e la riga in modalità esclusiva

X:blocca il tavolo in modalità esclusiva

Cos'è la risorsa Accoda

Ciascuna coda viene mantenuta tramite una struttura di risorse dal server Oracle ed è identificata come spiegato sopra. Una struttura di risorse ha tre elenchi

  1. Elenco dei proprietari
  2. Lista d'attesa
  3. Elenco convertitori

Quando un utente richiede un blocco su una risorsa in una determinata modalità, ottiene una struttura di blocco e fa una richiesta per acquisire il blocco su una determinata risorsa. Viene inserito in questi elenchi della struttura della risorsa in base al blocco richiesto.

Quindi l'utente   prima richiede quella risorsa, quindi verrà inserita nell'elenco dei proprietari

La struttura delle risorse è ottenuta dalla tabella delle risorse e la struttura dei blocchi è ottenuta dalla tabella dei blocchi. Sono entrambi allocati in SGA

Il numero di righe nella tabella delle risorse è definito dal parametro di inizializzazione enqueue_resources. I valori in uso possono essere visualizzati in v$resource view

Il numero di righe nella tabella della struttura dei blocchi è definito dal parametro di inizializzazione _enqueue_locks. I valori in uso possono essere visualizzati in v$enqueue_lock

Come viene eseguita la ricerca nella tabella delle risorse?

  • La tabella delle risorse contiene tutta la struttura delle risorse. Un algoritmo di hashing viene utilizzato per trovare e accedere alla struttura delle risorse nella tabella delle risorse.
  • La tabella delle risorse è organizzata in hash bucket. Ogni hash bucket contiene un elenco di strutture di risorse in forma di elenco collegato.
  • Quando la risorsa è in ricerca, il suo hash viene ottenuto utilizzando l'algoritmo di hash, quindi si ottiene il latch per trovare il bucket di hash corrispondente e quindi la risorsa viene ricercata nell'elenco nel bucket di hash. Se la risorsa viene trovata, viene ottenuta la struttura del blocco e la richiesta viene inserita proprietario, cameriere e lista dei convertiti in base al livello di blocco specificato richiesto

Esempio TM-575-0 hash della risorsa nel bucket 1, viene ottenuta una catena hash di accodamento latch per accedere al bucket hash e si accede all'elenco nel bucket per ottenere la struttura della risorsa

  • Se la risorsa non viene trovata nell'elenco di bucket e una nuova struttura di risorse viene ottenuta dall'elenco di risorse libere e inserita nell'elenco di bucket. Ciò accade sotto il fermo Enqueue. Viene inoltre assegnata una struttura di blocco

La richiesta di blocco viene inserita nell'elenco dei proprietari della struttura delle risorse

Come funzionano le operazioni di accodamento?

Quando un utente richiede un blocco sulla risorsa, il server Oracle esegue le seguenti operazioni

  • Se non è attualmente di proprietà, la risorsa viene concessa all'utente
  • Se è di proprietà e ci sono camerieri e trasformatori, viene posizionato in fondo alla coda dei camerieri
  • Se è di proprietà ma non ci sono cameriere e convertitore, se è compatibile con il blocco proprietario, la richiesta è accolta. Se non è compatibile, viene inserito nella lista dei camerieri
  • Un convertitore può procedere se la richiesta è meno restrittiva del blocco attualmente in uso o se la modalità richiesta è compatibile con il blocco in possesso dell'altro proprietario
  • Un cameriere può procedere se l'elenco dei convertitori è vuoto, non ci sono camerieri davanti e il blocco richiesto è compatibile con il blocco che ha attualmente
  • Il convertitore viene sempre elaborato prima dei camerieri.
  • Il server Oracle controlla queste code ogni volta che il blocco viene rilasciato o convertito.

Come viene controllata la coda quando il blocco Oracle viene rilasciato o convertito

  • I processi in attesa che le risorse dormano sui semafori e i semafori vengono utilizzati come meccanismi di sonno/riattivazione. Dopo essersi accodato alla coda, il processo di richiesta andrà in sospensione sul semaforo utilizzando la chiamata sync_op.

sync_op(SYNC_WAIT, SYNCF_BINARY, 300) =1

  • Una volta che il processo che contiene la risorsa è pronto per rilasciare la risorsa, esamina la coda collegata alla struttura della risorsa. Se è presente un processo in coda, invia un segnale semaforo al processo in attesa utilizzando

sync_op chiamata.

sync_op(0x0005, SYNCF_BINARY, 134491620) =1

  • Il processo di attesa gestirà il segnale e si risveglierà. Questo processo di attesa modifica lo stato secondo i passaggi indicati nell'operazione di accodamento

Tipi comuni di coda

JQ – Coda lavori. Quando un lavoro (inviato da DBMS_JOB.SUBMIT) è in esecuzione, è protetto da una coda JQ (il che significa che solo un processo SNP può eseguire il lavoro).

ST – Transazione di gestione dello spazio . L'accodamento ST deve essere mantenuto ogni volta che la sessione sta allocando/de-allocando estensioni (il che significa che vuole modificare le tabelle del dizionario UET$ e FET$), come coalescing, drop/truncate segments e disk-sorting. Se la sessione ottiene un timeout quando si richiede l'accodamento ST, viene restituito "Timeout ORA-1575 in attesa per la gestione dello spazio".

TM – DML (tabella)  accoda. Ogni volta che una sessione vuole bloccare un tavolo, viene richiesta una coda TM. Se una sessione elimina una riga nella tabella genitore (DEPT) e viene creato un vincolo referenziale (chiave esterna) senza un indice sulla tabella figlio (EMP), o se la sessione sta aggiornando la/le colonna/e che la riferimenti chiave a quindi un blocco di condivisione (livello 4)  viene preso nella tabella figlio. Se un'altra sessione tenta di apportare modifiche alla tabella figlio, deve attendere (perché desidera l'accodamento in modalità esclusiva di riga e ciò non è compatibile con la modalità di condivisione). Se viene creato un indice sulla colonna della chiave esterna della tabella figlio, non è richiesto alcun blocco condivisione sulla tabella figlio.

TX – Transazione. Non appena viene avviata una transazione, è necessaria una coda TX. Una transazione è definita in modo univoco dal numero del segmento di rollback, dal numero di slot nella tabella delle transazioni del segmento di rollback e dal numero di sequenza del numero di slot. Una sessione può essere in attesa su una coda TX per diversi motivi:

1) Un'altra sessione sta bloccando la riga richiesta.

2) Quando due sessioni tentano di inserire la stessa chiave univoca in una tabella (nessuna di loro ha eseguito un COMMIT), l'ultima sessione attende che la prima effettui il COMMIT o il ROLLBACK.

3) Non ci sono ITL (Interested Transaction List) liberi nell'intestazione del blocco (aumentare INI_TRANS och PCT_FREE per il segmento).

UL – Blocco utente . Una sessione ha ottenuto un blocco con la funzione DBMS_LOCK.REQUEST.

Viste e tabella per visualizzare l'accodamento Oracle e i blocchi Oracle

V$sessione e v$session_wait

Quando la sessione è in attesa di accodamento o blocco, può essere una sessione da V$session (in 11g e versioni successive) 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

Possiamo utilizzare la query seguente per ottenere tutta la coda nel sistema

Select event,p1, p2,p3 from v$session_wait  where wait_time=0 and event like 'enq%';
  1. V$lock è un'altra vista utile per controllare le code
  2. V$lock elenca tutte le strutture di lock attualmente presenti nel sistema
  3. Il tipo di colonna ,id1 e id2 rappresentano il tipo di risorsa  ,id1 e id2 della struttura della risorsa, quindi può essere unito a V$resource che contiene l'elenco di tutta la struttura della risorsa
  • LMODE e request ci dicono quale coda (proprietario,convertitore,cameriere) è la sessione
LMODE Richiesta Nome coda
> 0 =0 Proprietario
=0 > 0 Cameriere
> 0    >  0 Convertitore

La query sottostante può essere utilizzata per trovare titolare e cameriere

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
;

In caso di RAC, la query sottostante potrebbe essere utilizzata per scoprire bloccanti e camerieri

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$oggetto_bloccato

è un'altra vista utile per i blocchi delle tabelle Oracle

Contiene tutti i blocchi TM nel database. Fornisce lo slot di transazione, il processo del sistema operativo e l'ID di sessione della sessione che contiene i blocchi TM

Esistono diverse viste che possono essere utilizzate per trovare le informazioni sui blocchi. Queste viste sono create da catblock.sql

DBA_LOCKS Mostra tutti i blocchi come v$lock
DBA_DML_LOCKS Mostra tutti i blocchi DML™ mantenuti o richiesti
DBA_DDL_LOCKS Mostra tutti i blocchi DDL mantenuti o richiesti
DBA_WAITERS Mostra tutte le sessioni in attesa, ma non in attesa per i blocchi
BLOCCANTI_DBA Mostra le sessioni non in attesa con blocchi in attesa

Query per scoprire le sessioni in attesa e in attesa in 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
/

Interroga per scoprire tutti gli oggetti bloccati

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'
/

Come vengono gestiti i blocchi DML nel server Oracle

Quando un aggiornamento, inserisce, elimina o seleziona per l'aggiornamento viene eseguito sulla tabella Oracle, Oracle prende questi due blocchi

  • Blocco tabella DML:per garantire la coerenza della definizione dell'oggetto per la durata della transazione. Ciò impedisce che si verifichino operazioni DDL mentre è in corso un DML.
  • Blocco riga DML:serve a garantire la coerenza dei dati durante l'esecuzione della transazione. Possiamo riformulare come Questo ottiene un blocco sulla riga particolare che viene toccata e qualsiasi altra transazione che tenta di modificare la stessa riga viene bloccata, fino a quando quella che già la possiede non finisce

Come vengono implementati i blocchi delle tabelle Oracle

Abbiamo già spiegato l'infrastruttura di Enqueue nella sezione precedente. Lucchetti Oracle Table sono implementati come TM Enqueue

Quindi la struttura di Enqueue sarebbe

TM- -0

Le modalità sono

RS:condivisione riga

RX:riga esclusiva

S:condividi

SRX:condividi riga esclusiva

X:esclusivo

Ciascun cursore mantiene un elenco di strutture di blocco della tabella che viene compilato durante l'analisi dell'istruzione. Alla prima esecuzione, viene effettuata una chiamata di funzione per bloccare tutta la tabella nell'elenco. I blocchi vengono rilasciati quando viene eseguito il commit o il rollback della transazione.

La possibilità di rollback, in particolare il rollback a un punto di salvataggio, aggiunge un'altra dimensione di complessità al blocco del dizionario. Vale a dire, se una transazione viene annullata oltre il punto in cui è stato aggiornato un blocco, il blocco deve essere declassato di conseguenza, come parte dell'operazione di rollback, al fine di ridurre il rischio di deadlock artificiali.

I requisiti del blocco del dizionario per le transazioni e, in particolare, il mantenimento di una cronologia delle conversioni di blocco, sono forniti dai blocchi DML insieme a TM enqueue. Ogni transazione in possesso di un blocco DML contiene anche un blocco di accodamento TM. La funzionalità di blocco di base è fornita dalla coda e il blocco DML aggiunge la manutenzione della cronologia delle conversioni.

L'array fisso di strutture di blocco DML viene ridimensionato dal parametro DML_LOCKS. La sua lista gratuita è protetta dal latch di allocazione del blocco dml e gli slot attivi sono visibili in V$LOCKED_OBJECT .

Per impostare i DML_LOCK, controllare l'utilizzo in v$resource_limit. Possiamo impostarlo generosamente poiché occupa molto meno spazio

Come disabilitare i blocchi della tabella?

  • I blocchi DML e i blocchi di accodamento TM associati possono essere disabilitati, completamente o solo per determinate tabelle.
  • Per disabilitare completamente questi blocchi, il parametro DML_LOCKS deve essere impostato su zero. In un database di server parallelo, deve essere impostato su zero in tutte le istanze.
  • Per disabilitare tali blocchi su una tabella particolare, è necessario utilizzare la clausola DISABLE TABLE LOCKS dell'istruzione ALTER TABLE.
  • Se i blocchi sono disabilitati per una tabella, le istruzioni DML possono comunque modificare i blocchi della tabella e i blocchi a livello di riga vengono comunque mantenuti. Tuttavia, i blocchi della tabella in modalità sub-condivisa normalmente associati alle query e i blocchi della tabella in modalità sub-esclusiva normalmente associati a DML non vengono presi. Al contrario, le transazioni contro il tavolo sono protette da DDL in conflitto semplicemente vietando tutti i tentativi di bloccare l'intero tavolo, e quindi tutti i DDL contro il tavolo.
  • La disabilitazione dei blocchi della tabella può aumentare le prestazioni poiché il sovraccarico di acquisizione dei blocchi viene ridotto   Ciò è particolarmente importante nel caso di RAC in cui questo sovraccarico è piuttosto elevato.
  • La disabilitazione dei blocchi delle tabelle impedisce anche la creazione di indici di chiave esterna. Poiché la chiave esterna deve essere indicizzata per evitare il blocco della tabella della tabella figlio mentre le righe vengono manipolate nella tabella padre. Quindi, se disabilitiamo il blocco della tabella tutti insieme, gli indici non sono richiesti
  • È preferibile utilizzare alter table per disabilitare i table lock su alcune tabelle, quindi impostare su dml_locks table. Come se dml_locks fosse impostato su zero, dovremo rimbalzare l'istanza per impostarla di nuovo
  • Nell'inserimento a caricamento diretto, una sessione prenderà l'accodamento TM in modalità "X". Ciò impedisce l'esecuzione di qualsiasi altro DML durante il caricamento diretto, oltre a bloccare tutti i DDL

Come vengono implementati i blocchi di riga DML

I blocchi di riga DML sono implementati come combinazione delle seguenti due cose

  1. Blocco a livello di riga:viene implementato come byte di blocco in ogni intestazione di riga e ITL (elenco di transazioni interessate) in ogni blocco di dati o indice. Questi non sono memorizzati nella cache da nessuna parte e poiché sono archiviati nel blocco stesso non in SGA che è limitato, questo meccanismo di blocco di Oracle è estremamente scalabile
  2. Blocchi delle transazioni:sono implementati come TX Enqueue

Il byte di blocco punta alla voce ITL nel blocco e Tutte le voci ITL per la transazione punta alla coda TX che determina in definitiva se la transazione è stata salvata o ripristinata. I camerieri attenderanno il blocco della transazione

Esempio

  • Una transazione A vuole aggiornare le righe 2 e 3 nel blocco. Assegnerà un ITL (elenco delle transazioni interessate). La transazione accede alle righe 2 e 3 e vede il byte di blocco. Se il byte di blocco è zero, non è bloccato. La transazione aggiornerà la riga 3 ,3
  • Ora inizia una transazione B   e vuole aggiornare le righe 1 . Assegnerà un ITL (elenco delle transazioni interessate). La transazione accede alla riga 1 e vede il byte di blocco. Se il byte di blocco è zero, non è bloccato. La transazione aggiornerà la riga 1
  • Ora la transazione vuole aggiornare la riga 2. Accederà alla riga e la troverà bloccata poiché il byte di blocco non sarà zero. Guarderà nell'ITL che contiene il blocco. Eseguirà la pulizia ITL per scoprire se la transazione è attiva o meno. In questo caso, troverà la Transazione A attiva. Quindi la transazione B deve attendere la transazione A per eseguire il rollback o il commit. La transazione B attenderà di richiedere la coda TX che la transazione A detiene in modalità esclusiva

Che cos'è l'elenco delle transazioni interessate (ITL)

Quando una sessione vuole modificare un blocco, deve allocare un ITL nel blocco. ITL è la struttura dati nell'intestazione del blocco che contiene molti slot occupati dalla transazione. Viene definito dal parametro INITRANS e MAXTRANS al momento della creazione della tabella. I numeri iniziali di slot vengono creati secondo INITTRANS e crescono dinamicamente fino al massimo di MAXTRANS

Cos'è la transazione?

Quando una sessione aggiorna /elimina/inserisci , viene avviata una transazione. Viene completato quando si è verificato il commit o il rollback. Una transazione è identificata dall'identificatore della transazione (XID). La transazione identifica si compone di tre parti

  1. Numero di segmento di rollback o annullamento
  2. Numero slot tabella transazioni
  3. Sequenza o avvolgimento no

XID=usn#.slot#.wrap#

Ogni blocco ITL conterrà l'XID

Una pulizia dell'ITL significa cercare l'XID nell'ITL e cercare i segmenti di rollback in base a questo e cercare la tabella della transazione e il numero di wrap per verificare l'attività della transazione.

Possiamo usare il comando seguente per scaricare qualsiasi segmento di rollback

Modificare l'intestazione di annullamento del dump di sistema ;

Ogni transazione attiva può essere visualizzata nella v$transaction table

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

L'identificatore di transazione (XID) può essere ottenuto anche nella propria sessione utilizzando

select dbms_transaction.local_transaction_id from dual;

L'attesa su TX enq verrà visualizzata in v$session_wait

P1:Nome|modalità

P2:rbs3|avvolgi#

P3:slot#

Per riassumere i blocchi di riga DML

Il primo DML in una sessione in cui una transazione non esiste già creerà implicitamente una transazione.

  • Verranno assegnati un numero di segmento di annullamento, uno slot e un avvolgimento
  • Verrà creata un'istanza della coda TX

Quando viene individuata una riga da modificare, la sessione prenderà una voce nell'ITL del blocco dati, assegnandola alla transazione

  • USN/SLOT/WRAP verranno scritti nello slot ITL, riservando quello slot per la transazione corrente
  • Il blocco verrà eseguito sulla riga, impostando il byte di blocco nella directory della riga in modo che punti allo slot ITL della transazione corrente

Sia TM che TX Enqueue possono essere visualizzati in V$lock

  • Il tipo identifica TM o TX
  • ID1 e ID2 possono contenere informazioni aggiuntive, ma sono sensibili al contesto rispetto al TIPO di coda
  • Per TM enqueue, ID1 è l'OBJECT_ID dell'oggetto bloccato, a cui si può fare riferimento in DBA_OBJECTS, e ID2 è sempre 0
  • Per TX Enqueue, ID1 e ID2 mantengono il numero del segmento di annullamento, il numero dello slot e il wrapping

Esempio dettagliato per spiegare il funzionamento dei lucchetti Oracle

  • Crea la tabella fittizia
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
  • Sessione A
Select * from j for update;

Vediamo cosa è presente in 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


Quindi lo vediamo qui

Viene creato il blocco tabella DML Oracle

Viene creato TX(blocco transazione)

  • Iniziamo la sessione 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

Quindi lo vediamo qui

Viene creato il blocco tabella DML

Viene creato TX(blocco transazione)

Ora proviamo a farlo

Select * from j for update;

Questo si bloccherà

  • Inizia l'altra sessione per analizzare il problema

Se vedi i dettagli della sessione sid =2032 in 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 riga in grassetto è richiesta 6 (blocco esclusivo) su alcune TX enq

Ora possiamo utilizzare la query seguente per trovare la sessione di blocco

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

Ora possiamo eseguire il commit o il rollback della sessione 2125 affinché la transazione B proceda. Possiamo terminare la sessione 2125 utilizzando il comando seguente anche per rilasciare il blocco

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

Alcune informazioni aggiuntive

I blocchi TX in v$lock non indicano le informazioni sulla riga in cui è presente la contesa. Possiamo visualizzare queste cose usando le query

La query seguente deve essere eseguita dalla sessione in attesa

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’;

Articoli correlati

Come funziona il blocco Oracle
Come trovare i dettagli della sessione nel database Oracle
Importante controllo dell'integrità del database
domande dell'intervista dba di Oracle apps
Query per controllare i blocchi nel database di Oracle
oracle dba domande del colloquio

Corsi consigliati

Di seguito sono riportati alcuni dei corsi consigliati che puoi acquistare se vuoi fare un ulteriore passo avanti

Di seguito sono riportati i link ad alcuni dei corsi


Oracle DBA 11g/12c – Amministrazione database per Junior DBA :questo corso è adatto alle persone che iniziano come Junior DBA o aspirano a diventare Oracle DBA. Ciò fornirà una buona comprensione delle attività di backup e ripristino e amministrazione generale
Oracle Database:Oracle 12C R2 RAC Administration :questo corso copre l'installazione e l'amministrazione di Oracle RAC. Un buon corso per Oracle DBA che desidera aggiornare le proprie competenze per Oracle RAC
Oracle Data Guard:Database Administration for Oracle 12C R2 :questo corso copre l'installazione e l'amministrazione di Oracle Dataguard. Un buon corso per Oracle DBA che vuole aggiornare le sue competenze per Oracle Dataguard