Mam aplikację, która potencjalnie wykonuje tysiące wstawek do bazy danych SQL Server 2005. Jeśli wstawka z jakiegoś powodu nie powiedzie się (ograniczenie klucza obcego, długość pola itp.), Aplikacja jest zaprojektowana do rejestrowania błędu wstawiania i kontynuowania.SqlTransaction zakończył
Każda wstawka jest niezależna od pozostałych, więc transakcje nie są potrzebne dla integralności bazy danych. Jednak chcemy je wykorzystać do zwiększenia wydajności. Kiedy korzystam z transakcji, otrzymamy następujący błąd na około 1 na każde 100 zatwierdzeń.
This SqlTransaction has completed; it is no longer usable.
at System.Data.SqlClient.SqlTransaction.ZombieCheck()
at System.Data.SqlClient.SqlTransaction.Commit()
Aby spróbować wyśledzić przyczyny umieściłem oświadczenia w każdej operacji transakcji prześledzić więc mogę zapewnić, że transakcja nie była zamknięta przed wywołaniem popełnić. Potwierdziłem, że moja aplikacja nie kończy transakcji. Następnie uruchomiłem aplikację ponownie, używając dokładnie tych samych danych wejściowych i udało się.
Jeśli wyłączysz wylogowanie, ponownie się nie powiedzie. Włącz go i to się uda. Przełączanie włączania/wyłączania odbywa się za pomocą pliku app.config bez potrzeby ponownej kompilacji.
Oczywiście rejestracja zmienia czas i powoduje jego działanie. To wskazywałoby na problem z gwintowaniem. Jednak moja aplikacja nie jest wielowątkowa.
Widziałem jeden wpis MS KB wskazujący na błąd związany ze środowiskiem .Net 2.0 może powodować podobne problemy (http://support.microsoft.com/kb/912732). Jednak dostarczona przez nich poprawka nie rozwiązuje tego problemu.
Użyj transakcji "dla zwiększenia wydajności"? W jaki sposób wykorzystanie transakcji poprawia wydajność? – LukeH
Uzgodniono z Łukaszem, dlaczego widzisz lub myślisz, że masz taki efekt? – eglasius
posiadanie transakcji wokół wielu wkładek ogólnie zwiększa wydajność, testuj sam i zobacz. poprzez transakcję zmniejszasz liczbę blokad, które musisz zdobyć przed wstawianiem. –