2013-05-24 10 views
5

Immaginate l'esecuzione di una query utilizzando il codice simile a questo qui:Dopo una query Lettura non inviata, devo reimpostarla su Committed?

using (SqlConnection TheConnection = GetSqlConnectionNoCatch(SQLConnectionStr)) 
using (SqlDataAdapter TheDataAdapter = new SqlDataAdapter(SQLStatement, TheConnection) { MissingSchemaAction = SchemaAction }) 
{ 
    DataSet TheDataSet = new DataSet(); 
    TheDataAdapter.SelectCommand.CommandTimeout = SQLTimeout; 
    TheDataAdapter.Fill(TheDataSet, TableName); 

    return TheDataSet; 
} 

E immaginare di dover leggere una tabella di database che è assolutamente ottenere pestate, non-stop, con le scritture, che porta ad un sacco di situazioni di stallo e fallimenti quindi devi eseguire quella lettura utilizzando un livello di isolamento non inviato di lettura.

Se la mia domanda normale era:

SELECT Field1, Field2 FROM Table WHERE some_type_of_clause 

vedo spesso che cambieresti a:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 
SELECT Field1, Field2 FROM Table WHERE some_type_of_clause 

OK, quindi ecco quello che mi ha portato a questa domanda, questo particolare link: http://blog.sqlauthority.com/2011/04/17/sql-server-applying-nolock-hint-at-query-level-nolock-for-whole-transaction/

il suo esempio ha la seguente:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 
SELECT * 
FROM AdventureWorks.Sales.SalesOrderDetail sod 
INNER JOIN AdventureWorks.Sales.SalesOrderHeader soh ON 
sod.SalesOrderID = soh.SalesOrderID 
ORDER BY sod.ModifiedDate 
-- Set isolation level to original isolation level 
SET TRANSACTION ISOLATION LEVEL READ COMMITTED 

Devo reimpostarlo su READ COMMITTED anche alla fine della mia ricerca? O la mia lettura non è valida solo per quella domanda? O forse la vita della connessione (che esaminando il mio codice significherebbe non appena restituisco il DataSet, come la mia connessione si chiude proprio in quel momento)?

La maggior parte degli esempi sul Web non consente di tornare al livello di isolamento originale, quindi mi ha confuso che l'abbia incluso. Grazie!

risposta

5

La risposta qui può essere utile: livello di isolamento WITH (NOLOCK) vs SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

La transazione è un'impostazione livello di connessione. Ciò significa che qualsiasi chiamata di stored procedure nidificata, ecc utilizzerà la nuova impostazione del livello di isolamento, ma altri utenti/query windows/sessione dallo stesso utente utilizzeranno il valore predefinito applicabile (o qualsiasi altro valore impostato per ultimo).

Nel tuo caso, non è necessario impostare nuovamente il livello di isolamento su commit, a meno che non siano presenti altre istruzioni o set di dati da restituire che non dovrebbero utilizzare in seguito non collegati nella stessa sessione. Il ripristino è semplicemente una buona pratica.

+0

Grazie mille per la risposta - segno di spunta verde e un upvote! – JustLooking

Problemi correlati