Sto eseguendo diverse query SQL di lunga durata come parte di un modulo di reporting. Queste query sono costruite dinamicamente in fase di esecuzione. A seconda dell'input dell'utente, possono essere singole o multi-statement, avere uno o più parametri e operare su una o più tabelle di database - in altre parole, la loro forma non può essere facilmente anticipata.Utilizzare SqlTransaction & IsolationLevel per operazioni di lettura lunghe?
Attualmente, sto solo l'esecuzione di queste dichiarazioni su un normale SqlConnection
, cioè
using (SqlConnection cn = new SqlConnection(ConnectionString)) {
cn.Open();
// command 1
// command 2
// ...
// command N
}
Perché queste query (davvero interrogare lotti) può prendere un po 'per l'esecuzione, io sono preoccupato per serrature sulle tavole alzando legge/scrive per altri utenti. Non è un problema se i dati di questi report cambiano durante l'esecuzione del batch; le query del report non dovrebbero mai avere la precedenza su altre operazioni su quelle tabelle, né dovrebbero bloccarle.
Per la maggior parte delle operazioni long-running/multi-statement che comportano la modifica dei dati, vorrei utilizzare le transazioni. La differenza qui è che queste query di report non stanno modificando alcun dato. Sarei corretto nel wrapping di queste query di report in un SqlTransaction
al fine di controllare il loro livello di isolamento?
cioè:
using (SqlConnection cn = new SqlConnection(ConnectionString)) {
cn.Open();
using (SqlTransaction tr = cn.BeginTransaction(IsolationLevel.ReadUncommitted)) {
// command 1
// command 2
// ...
// command N
tr.Commit();
}
}
Sarebbe questo raggiungere il mio risultato desiderato? È corretto commettere una transazione, anche se nessun dato è stato modificato? C'è un altro approccio?
Fare i rapporti devono essere [corretta] (http://blogs.msdn.com/b/sqlcat/archive/2007/02/01/previously-committed-rows-might- be-missed-if-nolock-hint-is-used.aspx) o no? –
@RemusRusanu I report forniscono un'istantanea istantanea dei dati per un lungo periodo di tempo; non è necessario tenere conto delle modifiche che possono verificarsi a metà transazione. È probabile che le query sottostanti vengano eseguite più volte dall'utente in breve successione e l'utente non si aspetta che i risultati siano identici ogni volta. –
Questo è esattamente il tipo di rapporti che vengono influenzati (male) dalle letture sporche. I conteggi e gli aggregati salteranno in modo casuale su e giù e i dati all'interno di una singola analisi (un rapporto) non saranno coerenti (ad esempio, somma debito! = Somma del credito). I tuoi utenti perdono la fiducia nel rapporto poiché sembrerà che generino dati casuali. Hai considerato ['SNAPSHOT'] (http://msdn.microsoft.com/en-us/library/ms345124 (v = sql.90) .aspx)? –