Privacy & Cookie
Questo sito utilizza cookie. Continuando, accetti il loro utilizzo. Ulteriori informazioni, tra cui come controllare i cookie.
Questo articolo fa parte di Oracle Performance Tuning Series ed è stato creato per descrivere il meccanismo di blocco di Oracle.
Un blocco è una risorsa che è necessario tenere per ottenere l’accesso alla risorsa. Oracle ha due tipi di serrature: enqueues e chiusure, ora ci concentreremo su questi meccanismi di blocco individualmente.
Enqueues
Le Enqueues sono serrature sofisticate per la gestione dell’accesso alle risorse condivise (come tabelle, righe, lavori, ripeti thread). Un accodamento può essere richiesto in diversi livelli / modalità:
- Null
- Row share
- Row exclusive
- Share
- Share row exclusive
- Exclusive
Se una sessione contiene una richiesta di accodamento in modalità share, altre sessioni possono quindi accoda in modalità condividi (per la stessa risorsa). Se una sessione contiene un accodamento in modalità esclusiva, altre sessioni che vogliono ottenerlo-indipendentemente in quale livello-devono aspettare.
Quando l’accesso è richiesto da una sessione, viene ottenuta una struttura di blocco e viene effettuata una richiesta per acquisire l’accesso alla risorsa a un livello specifico (modalità). La struttura di blocco è posizionata su una delle tre liste collegate che pendono dalla risorsa, chiamata PROPRIETARIO (se l’enqueue potrebbe essere acquisita), CAMERIERE (se la sessione è in attesa di acquisire l’enqueue) e CONVERTITORE (la sessione tiene l’enqueue in un livello ma vuole convertirlo in un altro) liste.
Di seguito sono riportati alcuni tipi comuni di enqueues:-
- TM-Ogni volta che una sessione desidera bloccare una tabella, viene richiesto un accodamento TM. Se una sessione elimina una riga nella tabella padre e viene creato un vincolo referenziale (chiave esterna) senza un indice nella tabella figlio o se la sessione sta aggiornando le colonne a cui fa riferimento la chiave esterna, viene eseguito un blocco di condivisione nella tabella figlio. Se un’altra sessione tenta di apportare modifiche alla tabella figlio, deve attendere (perché desidera l’accodamento in modalità esclusiva riga e non è compatibile con la modalità di condivisione).
- TX-Non appena viene avviata una transazione è necessaria una richiesta di 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 richiesta TX per diversi motivi:
- Un’altra sessione sta bloccando la riga richiesta
- Quando due sessioni tentano di inserire la stessa chiave univoca in una tabella (nessuna di esse ha eseguito un COMMIT), quindi l’ultima sessione è in attesa del COMMIT o del ROLLBACK della prima.
- Non ci sono ITL (Interested Transaction List) gratuiti nell’intestazione del blocco.
- UL-Una sessione ha preso un blocco con DBMS_LOCK.Funzione di RICHIESTA.
Latch
Latch forniscono un meccanismo di serializzazione di basso livello che protegge le strutture di dati condivisi in SGA. Un latch è un tipo di blocco che può essere acquisito e liberato molto rapidamente. I fermi vengono in genere utilizzati per impedire a più di un processo di eseguire lo stesso pezzo di codice in un dato momento. Quando viene acquisito un latch, viene acquisito a un livello particolare per evitare deadlock. Una volta che un processo acquisisce un latch a un certo livello, non può successivamente acquisire un latch a un livello uguale o inferiore a quel livello (a meno che non lo acquisisca nowait). Associato a ciascun latch è una procedura di pulizia che verrà chiamata se un processo muore mentre si tiene il latch. Questa pulizia viene eseguita utilizzando i servizi di PMON. L’implementazione sottostante dei latch dipende dal sistema operativo, in particolare per quanto riguarda se un processo attenderà un latch e per quanto tempo.
L’obiettivo dei latch è gestire l’accesso simultaneo a strutture di dati condivise in modo tale che solo un processo possa accedere alla struttura alla volta. I processi bloccati (processi in attesa di eseguire una parte del codice per cui un latch è già stato ottenuto da un altro processo) attenderanno fino al rilascio del latch. Oracle utilizza istruzioni atomiche come “test and set” per operare su fermi. Poiché le istruzioni per impostare e liberare i fermi sono atomici, il sistema operativo garantisce che solo un processo lo ottiene e poiché è solo una singola istruzione, è abbastanza veloce.
Le richieste di latch possono essere effettuate in due modalità:
- willing-to-wait: una richiesta di modalità” willing-to-wait ” eseguirà il loop, attenderà e richiederà di nuovo fino a quando non si ottiene il latch.
- no wait : In modalità “no wait”, il processo richiederà il latch e se non è disponibile, invece di aspettare, ne viene richiesto un altro. Solo quando tutti falliscono, il processo del server deve attendere.
Differenza tra Latch& Enqueues
Una differenza tra un latch e un enqueue è che l’enqueue è ottenuto utilizzando un meccanismo di blocco specifico del sistema operativo, mentre un latch è ottenuto indipendentemente dal sistema operativo. Un accodamento consente all’utente di memorizzare un valore nel blocco (cioè la modalità in cui lo stiamo richiedendo). Il gestore di blocco del sistema operativo tiene traccia delle risorse bloccate. Se un processo non può essere concesso al blocco perché è incompatibile con la modalità richiesta e il blocco viene richiesto con wait, il sistema operativo mette il processo richiedente su una coda di attesa che viene servita in FIFO.
Un’altra differenza tra latch e enqueues è che enqueues mantiene e ordina la coda di camerieri mentre i latch non lo fanno. Tutti i processi in attesa di un latch riprovano contemporaneamente (a seconda dello scheduler). Ciò significa che uno qualsiasi dei camerieri potrebbe ottenere il fermo e plausibilmente il primo tentativo di ottenere il fermo potrebbe essere l’ultimo a farlo effettivamente. I camerieri Latch possono utilizzare i timer per riattivare e riprovare o possono girare (solo in multiprocessori) girando su un latch significa tenere la CPU e aspettare in attesa che quel latch venga liberato in breve tempo).