2013-08-18 4 views
13

Da this Java Oracle tutorial:Differenza tra lettura non ripetibile vs sporco leggere

Una lettura non ripetibile si verifica quando transazione A recupera una riga, transazione B aggiorna in seguito la riga, e la transazione A seguito recupera di nuovo la stessa riga. Transazione A recupera due volte la stessa riga ma visualizza dati diversi.

Qual è la differenza tra una lettura sporca e una lettura non ripetibile? Non è la stessa cosa? leggere il risultato sbagliato a causa dell'aggiornamento degli altri?

Grazie in anticipo.

risposta

14

L'esatto stessa pagina spiega che cosa una lettura sporca è:

Accesso a un valore aggiornato che non è stato commesso è considerato una lettura sporca perché è possibile che tale valore possa essere rotolato indietro al suo valore precedente . Se leggi un valore che viene successivamente ripristinato, avrai letto un valore non valido.

Quindi, la lettura non ripetibile consiste nella lettura di due valori di commit diversi, mentre la lettura dirty consiste nella lettura di un valore che non è stato ancora eseguito. Ben diversa.

+0

Come può essere possibile? Voglio dire, dopo che la transazione è stata completata, l'unico modo per prevenire la lettura non ripetibile è di mantenere il blocco anche dopo il commit ... Comunque prima o poi verrà effettuata un'altra connessione (B) e come impedirà l'aggiornamento di quel riga precedentemente recuperata da A – Rollerball

+0

O forse solo 1 connessione per volta potrebbe scrivere nel DBMS. Quindi, finché esiste una connessione attiva a un DBMS, nessun'altra connessione può effettivamente aggiornare il DB per quelle particolari righe (fino a quando la prima connessione non viene chiusa) Ho ragione? – Rollerball

+1

Una lettura ripetibile è garantita solo per la durata di una transazione: si avvia una transazione T1, si legge A1, quindi un'altra transazione T2 modifica A1 a A2 e si impegna, quindi la prima transazione T1 rilegge il valore e continua a leggere A1 . Questa è una lettura ripetibile. Naturalmente, un'altra transazione T3 che legge il valore per la prima volta dopo che T2 ha eseguito il commit leggerà il valore impegnato, A2. Per sapere come è implementato dal tuo database, leggi la sua documentazione. Molti di loro usano [MVCC] (http://en.wikipedia.org/wiki/Multiversion_concurrency_control), AFAIK. –

11

Da here: -

letture dirty si verificano quando una transazione legge i dati scritti da un altro, non impegnati , transazione. Il pericolo con letture sporche è che l'altra transazione non può mai impegnarsi, lasciando la transazione originale con dati "sporchi".

non ripetibile Legge verificano quando una transazione tenta di accedere agli stessi dati due volte e una seconda operazione modifica i dati tra il prima dell'operazione letto tentativi. Ciò potrebbe causare la prima transazione per leggere due valori diversi per gli stessi dati, causando la lettura originale per essere non ripetibile.

+0

Come può essere possibile però? Voglio dire, dopo che la transazione è stata completata, l'unico modo per prevenire la lettura non ripetibile è di mantenere il blocco anche dopo aver commesso ...Comunque prima o poi verrà effettuata un'altra connessione (B) e come impedirà l'aggiornamento di quella riga precedentemente recuperata da A – Rollerball

+0

o forse solo 1 connessione per volta potrebbe scrivere nel DBMS. Quindi, finché esiste una connessione attiva a un DBMS, nessun'altra connessione può effettivamente aggiornare il DB per quelle particolari righe (fino a quando la prima connessione non viene chiusa) Ho ragione? – Rollerball

+0

Una lettura non ripetibile è quella in cui una transazione non può leggere la seconda volta a meno che un'altra transazione non modifichi la riga. Mentre si esegue l'istruzione select, le letture non ripetibili si verificano quando i blocchi di lettura non vengono acquisiti. Le letture non ripetibili possono verificarsi in caso di necessità di transazione effettuata da un conflitto di commit, il rollback deve essere rilassato. –