2013-08-02 6 views

risposta

9

È possibile emettere blocchi in modo esplicito con il comando LOCK TABLE. Find out more

In caso contrario, un inserto non blocca altre righe. A causa del modello di isolamento di lettura di Oracle, la riga esiste solo nella nostra sessione fino a quando non la eseguiamo, quindi nessun altro può fare nulla con esso. Find out more.

Un'istruzione di aggiornamento blocca solo le righe interessate. A meno che non abbiamo implementato una strategia di blocco pessimista con SELECT ... FOR UPDATE. Find out more.

Infine, in Oracle gli scrittori non bloccano i lettori. Quindi anche le righe bloccate possono essere lette da altre sessioni, non possono essere modificate. Find out more.

Questo comportamento è integrato nel kernel Oracle e non è configurabile.


Justin fa un buon punto sul blocco DDL a livello di tabella. Tale blocco causerà una sessione che esegue DDL sulla tabella per attendere finché la sessione DML non si impegna, a meno che DDL non sia qualcosa come CREATE INDEX, nel qual caso fallirà immediatamente con ORA-00054.

+0

i collegamenti non sono attivi! –

+0

@Gab 是 好人 - ringrazia per avermelo fatto sapere. Li ho sostituiti con collegamenti all'ultima versione dei documenti. – APC

5

Dipende da cosa intendi per "blocco".

Per il 99,9% di ciò che è probabile che le persone si preoccupino, Oracle acquisirà un blocco a livello di riga quando viene modificata una riga. Il blocco a livello di riga consente ancora ai lettori di leggere la riga (a causa della coerenza della lettura in più versioni, i writer non bloccano mai i lettori ei lettori non fanno mai letture sporche).

Se colpisci lo v$lock, vedrai che l'aggiornamento di una riga comporta anche un blocco sul tavolo. Ma quel blocco impedisce solo a un'altra sessione di eseguire DDL sul tavolo. Dal momento che in pratica non avresti mai voluto fare DDL su un tavolo attivo, in genere non è qualcosa che potrebbe effettivamente indurre un'altra sessione ad attendere il blocco.

0

Probabilmente si dovrebbe leggere il manuale dei concetti di oracolo relativo al blocco. Per le operazioni DML standard (inserimento, aggiornamento, eliminazione, unione), oracle accetta un blocco DML (tipo TM) condiviso. Ciò consente ad altri DML sulla tabella di verificarsi simultaneamente (è un blocco di condivisione). Le righe modificate da un aggiornamento o l'eliminazione di un'operazione DML e non ancora impegnate avranno un blocco di riga esclusivo (tipo TX). Un'altra operazione DML in un'altra sessione/transazione può funzionare sulla tabella, ma se modifica la stessa riga verrà bloccata fino a quando il detentore del blocco di riga non lo rilascerà commettendo o eseguendo il rollback.

Le operazioni DML parallele e le operazioni di caricamento diretto dell'inserimento seriale richiedono blocchi di tabella esclusivi.

5

Quando viene eseguito un DML regolare (UPDATE/DELETE/INSERT, MERGE e SELECT ... FOR UPDATE) oracle ottiene 2 blocchi. Blocco livello riga (TX) - Questo ottiene un blocco sulla particolare riga che viene toccata e qualsiasi altra transazione che tenta di modificare la stessa riga viene bloccata, fino a quando quella che lo possiede già finisce. Table Level Lock (TM) - Quando si ottiene il blocco riga (TX), viene anche ottenuto un blocco Tabella aggiuntivo per impedire che eventuali operazioni DDL si verifichino mentre è in corso un DML.

Ciò che importa è in quale modalità si ottiene il blocco tabella. Un blocco di condivisione riga (RS), chiamato anche blocco tabella sottoschede (SS), indica che la transazione che contiene il blocco sul tavolo ha le righe bloccate nella tabella e intende aggiornarle. Un blocco SS è la modalità meno restrittiva del blocco tabella, offrendo il massimo grado di concorrenza per una tabella.

Un blocco di riga esclusiva (RX), detto anche blocco di tabella subexclusive (SX), indica che la transazione che contiene il blocco ha aggiornato le righe della tabella o emesso SELECT ... FOR UPDATE. Un blocco SX consente ad altre transazioni di interrogare, inserire, aggiornare, eliminare o bloccare le righe contemporaneamente nella stessa tabella. Pertanto, i blocchi SX consentono a più transazioni di ottenere blocchi simultanei SX e SS per la stessa tabella.

Un blocco tabella condivisa (S) trattenuto da una transazione consente ad altre transazioni di eseguire query sulla tabella (senza utilizzare SELECT ... FOR UPDATE) ma consente gli aggiornamenti solo se una singola transazione contiene il blocco della tabella condivisa. Più transazioni possono contenere contemporaneamente un blocco di tabelle condivise, quindi non tenere questo blocco non è sufficiente per garantire che una transazione possa modificare la tabella.

Un blocco tabella esclusivo della riga di condivisione (SRX), denominato anche blocco tabella secondario-secondario (SSX), è più restrittivo di un blocco tabella condivisa. Solo una transazione alla volta può acquisire un blocco SSX su una tabella specifica. Un blocco SSX detenuto da una transazione consente ad altre transazioni di interrogare la tabella (eccetto per SELECT ... FOR UPDATE) ma non aggiornare la tabella.

Un blocco tabella esclusivo (X) è la modalità più restrittiva del blocco tabella, consentendo alla transazione che detiene il blocco accesso in scrittura esclusivo alla tabella. Solo una transazione può ottenere un blocco X per una tabella.

+5

Questa è una copia letterale di Oracle [documentazione] (http://docs.oracle.com/cd/E11882_01/server.112/e41084/ap_locks001.htm#SQLRF55502). Si dovrebbe almeno accreditare la fonte originale e metterla come citazione. –