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-
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
- Elenco dei proprietari
- Lista d'attesa
- 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%';
- V$lock è un'altra vista utile per controllare le code
- V$lock elenca tutte le strutture di lock attualmente presenti nel sistema
- 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-
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
- 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
- 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
- Numero di segmento di rollback o annullamento
- Numero slot tabella transazioni
- 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