Di seguito si riporta la dichiarazione scritta da Wikipedia's Isolation article circa REPEATABLE READS
Alcuni 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 ?
Vedi http://stackoverflow.com/questions/10935850/when -to-use-select-for-update per una discussione di 'SELECT ... FOR UPDATE' – Gili
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
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