Przeprowadzam kilka długotrwałych zapytań SQL w ramach modułu raportowania. Te zapytania są budowane dynamicznie w czasie wykonywania. W zależności od danych wprowadzanych przez użytkownika, mogą to być pojedyncze lub wielokrotne wyciągi, mieć jeden lub więcej parametrów i działać na jednej lub wielu tabelach baz danych - innymi słowy, ich forma nie może być łatwo przewidziana.Użyj SqlTransaction & IsolationLevel do długotrwałej operacji odczytu?
Obecnie jestem po prostu wykonując te oświadczenia na zwykłym SqlConnection
, tj
using (SqlConnection cn = new SqlConnection(ConnectionString)) {
cn.Open();
// command 1
// command 2
// ...
// command N
}
Ponieważ te pytania (naprawdę kwerendy partii) może potrwać do wykonania, jestem zaniepokojony zamków na stołach trzyma się czyta/pisze dla innych użytkowników. Nie stanowi to problemu, jeśli dane dotyczące tych raportów zmieniają się podczas realizacji partii; kwerendy raportu nigdy nie powinny mieć pierwszeństwa przed innymi operacjami na tych tabelach, ani nie powinny je blokować.
Dla większości operacji długotrwałych/Multi-oświadczenie, które wymagają modyfikacji danych, chciałbym wykorzystywać transakcje. Różnica polega na tym, że te kwerendy raportu nie modyfikują żadnych danych. Czy poprawne jest zawijanie tych zapytań raportu w celu sprawdzenia ich poziomu izolacji?
tj:
using (SqlConnection cn = new SqlConnection(ConnectionString)) {
cn.Open();
using (SqlTransaction tr = cn.BeginTransaction(IsolationLevel.ReadUncommitted)) {
// command 1
// command 2
// ...
// command N
tr.Commit();
}
}
Czy to osiągnąć mój pożądany efekt? Czy prawidłowe jest zatwierdzenie transakcji, mimo że żadne dane nie zostały zmodyfikowane? Czy istnieje inne podejście?
Czy raporty mają być [właściwy] (http://blogs.msdn.com/b/sqlcat/archive/2007/02/01/previously-committed-rows-might- be-missed-if-nolock-hint-is-used.aspx) czy nie? –
@RemusRusanu Raporty zapewniają natychmiastową migawkę danych przez długi czas; nie muszą brać pod uwagę zmian, które mogą wystąpić w trakcie transakcji. Podstawowe zapytania będą prawdopodobnie uruchamiane wielokrotnie przez użytkownika w krótkim odstępie czasu, a użytkownik nie będzie oczekiwał, że wyniki będą za każdym razem identyczne. –
To jest dokładnie ten rodzaj raportów, które zostały uszkodzone (źle) przez brudne odczyty. Liczby i agregaty przeskakują losowo w górę i w dół, a dane w jednym przebiegu (raport) nie będą spójne (np. Suma debetu! = Suma kredytu). Twoi użytkownicy stracą zaufanie do raportu, ponieważ będzie on wydawał losowe dane. Czy zamiast tego rozważałeś ['SNAPSHOT'] (http://msdn.microsoft.com/en-us/library/ms345124 (v = sql.90) .aspx)? –