2011-09-14 19 views
5

Di seguito si riporta la dichiarazione scritta da Wikipedia's Isolation article circa REPEATABLE READSAlcuni chiarimenti su diversi livelli di isolamento nella transazione del database?

In questo livello di isolamento, una concorrenza implementazione DBMS di controllo di blocco a base continua a leggere e scrivere le serrature (acquisita sui dati selezionati) fino alla fine della transazione. Tuttavia, i blocchi di intervallo non vengono gestiti, pertanto può verificarsi il fenomeno di lettura fantasma (vedere di seguito).

La mia domanda qui è quando inizia e termina la transazione rispettivamente.

Se prendiamo l'esempio di non-ripetibili legge con Letture ripetibili livello di isolamento presso lo stesso link, come per la mia comprensione trnsaction 1 cominciano quando prima query viene sparato cioè SELECT * FROM users WHERE id = 1. DBMS manterrà il blocco sul tavolo gli utenti fino a quando e a meno che la transazione non finisca. qui Alla fine Voglio dire è quando la connessione ottiene il rollback o impegna non al completamento di SELECT * FROM users WHERE id = 1. Fino a quel momento La transazione 2 attenderà giusto?


Domanda 2: - Ora, se si considera il livello di isolamento e il loro comportamento come indicato di seguito (presso lo stesso link)

Isolation level  Dirty reads Non-repeatable Phantoms 
Read Uncommitted may occur  may occur  may occur 
Read Committed  -    may occur  may occur 
Repeatable Read  -    may occur  - 
Serializable  -    -    - 

Come per la mia comprensione più affidabile è Serializable quindi ripetibile leggere e poi Leggi Impegnato ma ho ancora visto le aplicazioni usando Leggi Impegnato. È perché il di prestazioni di lettura serializzabile e ripetibile è negativo rispetto a lettura impegnata perché in serializzabile sarà sequenziale e nel caso in cui della transazione deve attendere il rilascio del blocco da un'altra transazione. Giusto? Quindi per ottenere il meglio di tutti e tre, possiamo usare il livello di isolamento come Lettura Impegnato con SELECT FOR UPDATE (per ottenere una lettura ripetibile). Non sai come possiamo ottenere la lettura fantasma se vogliamo, in caso di lettura controllata livello di isolamento ?

+0

Vedi http://stackoverflow.com/questions/10935850/when -to-use-select-for-update per una discussione di 'SELECT ... FOR UPDATE' – Gili

+0

Quindi per ottenere meglio di tutti tre possiamo usare il livello di isolamento come Read Committed with SELECT FOR UPDATE: questo è l'approccio dei livelli di persistenza JDO come Datanucleus. Forniscono un meccanismo per controllare "SELECT FOR UPDATE" su una base per transazione. Credo che questo approccio offrirà i vantaggi del meccanismo di blocco delle transazioni Serializable quando si utilizzano tipi di transazione "inferiori". – marcolopes

+0

Sei sicuro che "Lettura ripetibile" potrebbe verificarsi in una transazione con livello di isolamento "Non ripetibile"? In questo articolo la tabella è diversa - http://www.oracle.com/technetwork/issue-archive/2010/10-jan/o65asktom-082389.html – naXa

risposta

6

Oracle non supporta il livello di isolamento REPEATABLE READ. Tuttavia, SQL Server funziona e blocca i blocchi su tutte le righe selezionate dalla transazione fino alla sua conclusione (vale a dire: è stato eseguito il commit o il rollback). Quindi sei corretto, questo farà sì che altre transazioni attenderanno (se stanno aggiornando i dati bloccati) e possono essere dannosi per la concorrenza.

Come per la domanda 2: Sì, maggiore è il livello di isolamento, peggiore sarà il risultato delle transazioni concorrenti perché devono attendere il rilascio di ulteriori blocchi. Non sono sicuro di cosa intendi per "ottenere il meglio di tutti e tre" utilizzando SELECT FOR UPDATE perché SELECT FOR UPDATE posizionerà blocchi di riga su tutte le righe selezionate.

E, infine, ecco una citazione da manuale di Oracle a bambino fantasma si legge:

[letture fantasma si verificano quando] una transazione riesegue una query che restituisce un insieme di righe che soddisfa una condizione di ricerca e scopre che un'altra transazione impegnati ha inserito righe aggiuntive che soddisfano la condizione.

Ad esempio, una transazione interroga il numero di dipendenti.Cinque minuti dopo esegue la stessa query, ma ora il numero è aumentato di uno perché un altro utente ha inserito un record per una nuova assunzione. Più dati soddisfano i criteri della query rispetto a prima, ma a differenza di una lettura fuzzy i dati letti in precedenza non sono stati modificati.


Riferimento:

+0

"Non sono sicuro di cosa intendi con" ottenere il meglio da tutti e tre "Fondamentalmente quello che sto cercando di fare qui è se usassimo il livello di isolamento read committed in oracle, otterremo comunque problemi di lettura non ripetibili e fantasma.Right? Come per mia comprensione prima di tutto non dovremmo chiamarli come problemi ma questi dovrebbero essere considerati come un comportamento corretto perché tra una prima transazione se la seconda transazione commessa dovremmo ottenere dati aggiornati. La luce? Continua ... –

+1

continua ... La seconda domanda è che se vogliamo evitare problemi di lettura non ripetibili e fantasma con read imputato su oracle, c'è un modo? Secondo me se usiamo select per query di aggiornamento possiamo essere salvati da letture non ripetibili .Coorect? Ma non è sicuro come possiamo evitare la lettura fantasma? –

Problemi correlati