Ich führe mehrere lang andauernde SQL-Abfragen als Teil eines Berichtsmoduls aus. Diese Abfragen werden zur Laufzeit dynamisch erstellt. Abhängig von der Eingabe des Benutzers können sie Einzel- oder Mehrfachanweisungen sein, einen oder mehrere Parameter haben und an einer oder mehreren Datenbanktabellen arbeiten - mit anderen Worten, ihre Form kann nicht leicht vorhergesehen werden.Verwenden Sie SqlTransaction & IsolationLevel für längere Lesevorgänge?
Derzeit bin ich gerade diese Aussagen auf einer gewöhnlichen SqlConnection
Ausführung, dh
using (SqlConnection cn = new SqlConnection(ConnectionString)) {
cn.Open();
// command 1
// command 2
// ...
// command N
}
Da diese Abfragen (wirklich Chargen abfragen) kann eine Weile dauern auszuführen, ich bin besorgt über Sperren für Tabellen liest hält/schreibt für andere Benutzer. Es ist kein Problem, wenn sich die Daten für diese Berichte während der Ausführung des Stapels ändern. Die Berichtsabfragen sollten niemals Vorrang vor anderen Operationen in diesen Tabellen haben und sie auch nicht sperren.
Für die meisten Operationen mit langer Laufzeit und mehreren Anweisungen, bei denen Daten geändert werden müssen, würde ich Transaktionen verwenden. Der Unterschied besteht darin, dass diese Berichtsabfragen keine Daten ändern. Würde ich diese Berichtsabfragen korrekt in eine umhüllen, um ihre Isolationsstufe zu kontrollieren?
heißt:
using (SqlConnection cn = new SqlConnection(ConnectionString)) {
cn.Open();
using (SqlTransaction tr = cn.BeginTransaction(IsolationLevel.ReadUncommitted)) {
// command 1
// command 2
// ...
// command N
tr.Commit();
}
}
Wäre dies mein gewünschtes Ergebnis erreichen? Ist es richtig, eine Transaktion zu begehen, obwohl keine Daten geändert wurden? Gibt es einen anderen Ansatz?
Haben die Berichte sein müssen [richtig] (http://blogs.msdn.com/b/sqlcat/archive/2007/02/01/previously-committed-rows-might- be-missed-if-nolock-Hinweis-is-used.aspx) oder nicht? –
@RemusRusanu Die Berichte liefern eine Momentaufnahme der Daten über einen langen Zeitraum hinweg. Sie müssen Änderungen, die während der Transaktion auftreten können, nicht berücksichtigen. Die zugrunde liegenden Abfragen werden vom Benutzer wahrscheinlich mehrere Male hintereinander ausgeführt, und der Benutzer erwartet nicht, dass die Ergebnisse jedes Mal identisch sind. –
Dies ist genau die Art von Berichten, die (schlecht) von Dirty Reads betroffen sind. Zählungen und Aggregate springen zufällig nach oben und unten und Daten innerhalb eines einzelnen Laufs (eines Berichts) sind nicht konsistent (z. B. Summenbelastung! = Summengutschrift). Ihre Benutzer werden das Vertrauen in den Bericht verlieren, da sie zufällige Daten zu produzieren scheinen. Haben Sie stattdessen ['SNAPSHOT'] (http://msdn.microsoft.com/en-us/library/ms345124 (v = sql.90) .aspx) in Betracht gezogen? –