Perché Oracle non ha nolock?


14

In MS SQL Server nolockpuò essere utilizzato allo scopo.

Perché non possiamo usarlo in Oracle e plsql?

Risposte:


21

SQL Server utilizza normalmente una strategia di blocco diversa da Oracle. La strategia predefinita utilizzata da SQL Server significa che la selezione delle righe comporta il blocco dei blocchi di lettura (su righe, pagine o l'intera tabella) *. Quindi ilNOLOCK volte questa è una clausola utile, anche se il consiglio generale è di non usarla mai, poiché cambia la semantica dei livelli di isolamento e può causare risultati incoerenti nell'output delle query.

* (Nota: questo è il valore predefinito. Se SNAPSHOTsi sceglie l'isolamento, il comportamento è diverso e i lettori non bloccano gli autori.)

In Oracle un processo di lettura non bloccherà mai un processo di scrittura. Quello che segue è un estratto di " Oracle Database Concepts 11g Release 2 ". Ti incoraggio a dare un'occhiata se sei interessato a come questo viene gestito da Oracle.

Concorrenza e coerenza dei dati

Riepilogo del comportamento di blocco

Il database mantiene diversi tipi di blocchi, a seconda dell'operazione che ha acquisito il blocco. In generale, il database utilizza due tipi di blocchi: blocchi esclusivi e blocchi condivisi. È possibile ottenere un solo blocco esclusivo su una risorsa come una riga o una tabella, ma è possibile ottenere molti blocchi di condivisione su una singola risorsa.

Le serrature influiscono sull'interazione di lettori e scrittori. Un lettore è una query di una risorsa, mentre uno scrittore è un'istruzione che modifica una risorsa. Le seguenti regole riepilogano il comportamento di blocco del database Oracle per lettori e scrittori:

• Una riga è bloccata solo quando modificata da uno scrittore.

Quando un'istruzione aggiorna una riga, la transazione acquisisce un blocco solo per questa riga. Bloccando i dati della tabella a livello di riga, il database riduce al minimo la contesa per gli stessi dati. In circostanze normali 1 il database non aumenta il blocco di una riga a livello di blocco o tabella.

• Un writer di una riga blocca un writer simultaneo della stessa riga.

Se una transazione sta modificando una riga, un blocco di riga impedisce a una transazione diversa di modificare contemporaneamente la stessa riga.

• Un lettore non blocca mai uno scrittore.

Poiché un lettore di una riga non lo blocca, uno scrittore può modificare questa riga. L'unica eccezione è un'istruzione SELECT ... FOR UPDATE, che è un tipo speciale di istruzione SELECT che blocca la riga che sta leggendo.

• Uno scrittore non blocca mai un lettore.

Quando una riga viene modificata da un writer, il database utilizza i dati di annullamento per fornire ai lettori una visione coerente della riga.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.