SQL Server: quale livello di isolamento per le istruzioni select non bloccanti?


9

Ho una transazione di lunga durata (chiamata, diciamo, T1) che esegue alcune eliminazioni, aggiornamenti e inserimenti su una tabella in SQL Server 2008 R2. Allo stesso tempo, un altro processo esegue periodicamente istruzioni select da questa tabella.

Con le impostazioni di isolamento predefinite (LEGGI IMPEGNATO, penso?), T1 blocca l'esecuzione di tutte le istruzioni selezionate fino a quando la transazione non viene confermata o ripristinata.

Quello che mi piacerebbe vedere è che le istruzioni selezionate funzionino su dati coerenti anche mentre la transazione è in corso. Credo che l'isolamento SNAPSHOT possa essere d'aiuto, ma non sono sicuro che stia andando nella giusta direzione. Questo sarebbe il miglior livello di isolamento per questa applicazione?

In secondo luogo, non ho alcun controllo sul processo che chiama le istruzioni select, ma ho il controllo sull'applicazione .NET che chiama T1. Eventuali modifiche al livello di isolamento sarebbero necessarie sia per le istruzioni select sia per T1 o sarebbe sufficiente contrassegnare solo T1 come con un livello di isolamento diverso?

Risposte:


8

In un mondo ideale avresti due scelte, SNAPSHOT e READ COMMITTED SNAPSHOT (RCSI). Assicurati di comprendere le basi dei livelli di isolamento delle transazioni prima di decidere quale è appropriato per il tuo carico di lavoro. In particolare, tieni presente i diversi risultati che potresti visualizzare a seguito del passaggio a RCSI.

Sembra che non sia un mondo ideale in quanto non si ha alcun controllo sull'applicazione che sta generando le istruzioni selezionate. In tal caso, l'unica opzione è abilitare RCSI per il database in questione in modo tale che le selezioni utilizzeranno automaticamente RCSI anziché READ COMMITTED.


6

Corretto, utilizzare l'isolamento SNAPSHOT per ottenere dati coerenti e sottoposti a commit da prima dell'inizio della transazione.

L'isolamento READ UNCOMMITTED (noto anche come suggerimento NOLOCK) leggerà dirtz, dati incoerenti

Quando si abilita l'isolamento SNAPSHOT, diventa effettivo per tutti i SELECT che vanno avanti. Si esegue ALTER DATABASEcon READ_COMMITTED_SNAPSHOT in questo caso

Modifica: aggiunto link + citazione di ALTER DATABASE (il mio grassetto)

Abilita l'opzione Snapshot in lettura a livello di database. Quando è abilitato, le istruzioni DML iniziano a generare versioni di riga anche quando nessuna transazione utilizza Isolamento istantanea. Una volta abilitata questa opzione, le transazioni che specificano il livello di isolamento di commit della lettura utilizzano il controllo delle versioni delle righe anziché il blocco. Quando una transazione viene eseguita al livello di isolamento di commit della lettura, tutte le istruzioni visualizzano un'istantanea dei dati esistente all'inizio dell'istruzione.

E dall'uso di Snapshot Isolation (il mio grassetto)

L'opzione di database READ_COMMITTED_SNAPSHOT determina il comportamento del livello di isolamento READ COMMITTED predefinito quando l'isolamento dello snapshot è abilitato in un database. Se non si specifica esplicitamente READ_COMMITTED_SNAPSHOT ON, READ COMMITTED viene applicato a tutte le transazioni implicite. Questo produce lo stesso comportamento dell'impostazione READ_COMMITTED_SNAPSHOT OFF (impostazione predefinita). Quando READ_COMMITTED_SNAPSHOT OFF è attivo, il Motore di database utilizza i blocchi condivisi per applicare il livello di isolamento predefinito. Se si imposta l'opzione di database READ_COMMITTED_SNAPSHOT su ON, il motore di database utilizza il controllo delle versioni delle righe e l'isolamento dello snapshot come predefinito, anziché utilizzare i blocchi per proteggere i dati.

Quindi sì.

L'abilitazione di RCSI consentirà alle letture di ottenere dati coerenti e non di essere bloccate dagli autori che continueranno a utilizzare Read Committed


4

Ti suggerirei di leggere la seguente domanda e le relative risposte: Problemi di blocco del database? .

Trovare il giusto livello di isolamento da utilizzare a livello di db è la cosa più veloce che puoi fare in questo momento per aiutarti a risolvere questo problema, perché ora è difficile cambiare tutte le applicazioni che toccano il database e cambiare il loro codice. Dal momento che hai detto "Non ho alcun controllo sul processo che sta chiamando le istruzioni select", la risposta più rapida sarebbe passare il livello di isolamento al livello di isolamento di Snapshot di lettura commesso, in modo da non toccare le query di lettura. Altrimenti dovresti usare il livello di isolamento Snapshot per le sessioni che leggono i dati durante le tue grandi transazioni.

Maggiori dettagli qui sulla scelta di quello giusto: Scelta dei livelli di isolamento basati su Versioning Row .

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.