Domanda

Penso che sopra i livelli di isolamento sono uguali.Qualcuno potrebbe descrivere con alcuni esempi qual'è la differenza principale è ?

È stato utile?

Soluzione

Read committed è un livello di isolamento che garantisce che tutti i dati che è stato di lettura commesso al momento, è di leggere.Semplicemente si limita al lettore di vedere qualsiasi intermedi, uncommitted, 'sporco' leggere.Non fa alcuna promessa di qualsiasi tipo che se l'operazione di re-problemi di lettura, troverete il Stesso dati, dati, è libero di cambiare dopo la lettura.

Repeatable read è un più alto livello di isolamento, che, oltre alle garanzie di lettura impegnata livello, inoltre garantisce che tutti i dati letti non può cambiare, se la transazione legge nuovamente gli stessi dati, troverà in precedenza di lettura dei dati, invariato, e disponibili per la lettura.

Il prossimo livello di isolamento serializable, rende ancora più forte garanzia:in aggiunta a tutto ciò, repeatable read garantisce, inoltre garantisce che no nuovo dati può essere visto da una lettura successiva.

Supponiamo di avere una tabella T, con una colonna C con una riga in esso, dire che non ha il valore '1'.E pensa che è un compito semplice, come riportato di seguito:

BEGIN TRANSACTION;
SELECT * FROM T;
WAITFOR DELAY '00:01:00'
SELECT * FROM T;
COMMIT;

Che è un compito semplice che problema due letture dalla tabella T, con un ritardo di 1 minuto tra di loro.

  • sotto LEGGI di TUTELA, la seconda SELECT può restituire qualsiasi dati.Le transazioni simultanee può aggiornare il record, eliminare, inserire nuovi record.La seconda selezionare vedrà sempre la nuovo dati.
  • sotto REPEATABLE READ SELECT seconda è garantita per visualizzare le righe che ha visto in prima selezionare invariato.Nuove righe possono essere aggiunti da transazioni simultanee in un minuto, ma le righe non possono essere cancellate, né modificate.
  • sotto SERIALIZABLE legge la seconda select è garantito a vedere esattamente le stesse righe come il primo.Nessuna riga può cambiare, né eliminati né la creazione di nuove righe potrebbe essere inserita da transazioni simultanee.

Se si segue la logica di cui sopra si può rapidamente realizzare che le transazioni SERIALIZZABILI, mentre essi possono rendere la vita facile per voi, sono sempre bloccare completamente ogni possibile concorrente di operazione, dal momento che essi richiedono che nessuno può modificare, eliminare o inserire una riga.Il valore predefinito livello di isolamento della transazione la .Net System.Transactions campo di applicazione è serializzabile, e questo di solito spiega l'abissale di prestazioni che di risultati.

E infine, c'è anche il livello di isolamento dello SNAPSHOT.Livello di isolamento dello SNAPSHOT fa le stesse garanzie come serializzabile, ma non richiedendo nessuna delle transazioni simultanee possibile modificare i dati.Invece, le forze di ogni lettore di vedere una sua propria versione del mondo (è proprio istantanea).Questo rende molto facile da programmare, ma anche molto scalabile come non bloccare aggiornamenti simultanei.Tuttavia, beneficio che viene fornito con un prezzo:extra server consumo di risorse.

Supplementare di legge:

Altri suggerimenti

Lettura ripetibile

Lo stato del database viene mantenuto fin dall'inizio della transazione. Se si recupera un valore in session1, quindi aggiornare il valore nella Sessione 2, recuperando di nuovo in session1 restituirà gli stessi risultati. Legge sono ripetibili.

session1> BEGIN;
session1> SELECT firstname FROM names WHERE id = 7;
Aaron

session2> BEGIN;
session2> SELECT firstname FROM names WHERE id = 7;
Aaron
session2> UPDATE names SET firstname = 'Bob' WHERE id = 7;
session2> SELECT firstname FROM names WHERE id = 7;
Bob
session2> COMMIT;

session1> SELECT firstname FROM names WHERE id = 7;
Aaron

Leggi Committed

Nel contesto di una transazione, si sarà sempre recuperare il valore più recente impegnato. Se si recupera un valore in session1, aggiornarla in Sessione 2, poi recuperarlo in session1again, si otterrà il valore come modificato in Sessione 2. Si legge l'ultima riga impegnato.

session1> BEGIN;
session1> SELECT firstname FROM names WHERE id = 7;
Aaron

session2> BEGIN;
session2> SELECT firstname FROM names WHERE id = 7;
Aaron
session2> UPDATE names SET firstname = 'Bob' WHERE id = 7;
session2> SELECT firstname FROM names WHERE id = 7;
Bob
session2> COMMIT;

session1> SELECT firstname FROM names WHERE id = 7;
Bob

Ha senso?

Semplicemente la risposta secondo la mia lettura e la comprensione di questo thread e @remo-rusanu risposta si basa su questo semplice scenario:

Ci sono due processi A e B.Processo B Tabella di lettura X Di Un processo di scrittura nella tabella X Il processo B è la lettura di nuovo la Tabella X.

  • ReadUncommitted:Il processo B può read uncommitted dati da Un processo e potrebbe vedere diverse righe in base B di scrittura. No lock a tutti
  • ReadCommitted:Il processo B può leggere SOLO commesso dati da Un processo, e si potevano vedere diverse righe in base COMMESSO solo B la scrittura. potremmo chiamarlo Semplice Blocco?
  • RepeatableRead:Il processo B di leggere gli stessi dati (righe) qualunque sia il Processo sta facendo.Ma il processo di Un possibile modificare le altre righe. Le righe a livello di Blocco
  • Serialisable:Il processo B di leggere le stesse righe come prima e Un Processo non può leggere o scrivere nella tabella. Tabella a livello di Blocco
  • Snapshot:ogni processo ha la sua copia e stanno lavorando su di esso. Ognuno ha il suo punto di vista

Vecchia questione, che ha accettato di rispondere già, ma mi piace pensare a questi due livelli di isolamento in termini di come si modifica il comportamento di blocco in SQL Server.Questo potrebbe essere utile per coloro che sono debug deadlock come lo ero io.

READ COMMITTED (impostazione predefinita)

Blocchi condivisi sono scattate nel SELEZIONARE e poi rilasciato quando l'istruzione SELECT completa.Questo è come il sistema può garantire che non ci siano sporco legge di commit.Altre operazioni ancora possibile modificare il sottostante le righe dopo la SELECT completa e prima che la transazione è completa.

REPEATABLE READ

Blocchi condivisi sono scattate nel SELEZIONARE e poi rilasciato solo dopo il completamento della transazione.Questo è come il sistema in grado di garantire che i valori di lettura non cambia durante la transazione (perché rimangono bloccati fino al completamento della transazione).

Cercare di spiegare questo dubbio con semplici diagrammi.

  

Leggi Committed: Qui, in questo livello di isolamento, di transazione T1 sarà leggendo il valore aggiornato del X commesso da transazione T2.

 Leggi Committed

  

Lettura ripetibile: In questo livello di isolamento, di transazione T1 sarà non prendere in considerazione i cambiamenti commessi dalla transazione T2.

 entrare descrizione dell'immagine qui

Credo che questa immagine può anche essere utile, mi aiuta come riferimento quando voglio ricordare rapidamente le differenze tra i livelli di isolamento (grazie a kudvenkat su youtube)

entrare descrizione dell'immagine qui

Si prega di notare che, il ripetibile per quanto riguarda lettura ripetibile a una tupla, ma non per l'intera tabella. In livelli di isolamento ANSC, phantom lettura anomalia può verificarsi, i quali mezzi leggono una tabella con lo stesso clausola where due volte può restituire diversi ritorno differenti insiemi di risultati. Letteralmente, non è ripetibile .

La mia osservazione sulla soluzione accettata iniziale.

Sotto RR (mysql di default) - Se un tx è aperto e un SELECT è stato licenziato, un altro tx può non eliminare qualsiasi fila appartenente al precedente set di risultati LEGGI fino si impegna tx precedente (in realtà istruzione delete nel nuovo testamento tx semplicemente appendere), tuttavia la prossima tx può cancellare tutte le righe dal tavolo senza alcuna difficoltà. Btw, una prossima LEGGI nel tx precedente vedrà ancora i vecchi dati fino a quando non è impegnato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top