2011-07-20 9 views
13

Mam proces serwera, który musi wykonać wiele zapytań do bazy danych, używa języka TPL do równoległego działania. Sprawdziło się dobrze przez cały ten rok, aż do dzisiaj, kiedy rozbił się dwukrotnie w ciągu 30 minut z następującym wyjątkiem.SqlException Transakcja została zakleszczona na zasobach bufora komunikacyjnego

Baza danych jest skonfigurowana tak, aby rejestrować wszelkie zakleszczenia, ale nie rejestrowała niczego, więc wydaje się, że ten zakręt wystąpił tylko po stronie klienta?

Nie znalazłem żadnych odniesień do tego wyjątku innych niż jeden msdn forum post that doesn't provide any information.

Czy ktoś wcześniej widział ten wyjątek? Czy wiesz, co mogę zrobić, aby uzyskać więcej informacji na ten temat?

---> System.AggregateException: One or more errors occurred. 

---> System.Data.SqlClient.SqlException: Transaction (Process ID 89) was deadlocked on communication buffer resources with another process and has been chosen as the deadlock victim. Rerun the transaction. 
    at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection) 
    at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning() 
    at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) 
    at System.Data.SqlClient.SqlDataReader.HasMoreRows() 
    at System.Data.SqlClient.SqlDataReader.ReadInternal(Boolean setTimeout) 
    at App.CoreEngine.V5.DataAccess.SqlReader.Read(String readerDescription) in C:\SourceCode\AppV1\Releases\Libraries\CoreEngine\CoreEngine.V5\DataAccess\SqlReader.cs:line 121 
    at App.CoreEngine.V5.DataAccess.DataContext.ExecuteQuery(PtQuery query, ValueStore`1 store, String readerDescription) in C:\SourceCode\AppV1\Releases\Libraries\CoreEngine\CoreEngine.V5\DataAccess\DataContext.cs:line 328 
    at App.CoreEngine.V5.DataAccess.DataContext.<>c__DisplayClass12.<GetCalculatedDataForCompare>b__f(Object _) in C:\SourceCode\AppV1\Releases\Libraries\CoreEngine\CoreEngine.V5\DataAccess\DataContext.cs:line 267 
    at System.Threading.Tasks.Task.Execute() 
    --- End of inner exception stack trace --- 
    at System.Threading.Tasks.Task.WaitAll(Task[] tasks, Int32 millisecondsTimeout, CancellationToken cancellationToken) 
    at App.CoreEngine.V5.DataAccess.DataContext.GetCalculatedDataForCompare() in C:\SourceCode\AppV1\Releases\Libraries\CoreEngine\CoreEngine.V5\DataAccess\DataContext.cs:line 276 
    at System.Threading.Tasks.Task`1.InvokeFuture(Object futureAsObj) 
    at System.Threading.Tasks.Task.Execute() 
    --- End of inner exception stack trace --- 
    at System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken) 
    at System.Threading.Tasks.Task`1.get_Result() 
    at App.CoreEngine.V5.DataAccess.DataContext.get_CalcCompareData() in C:\SourceCode\AppV1\Releases\Libraries\CoreEngine\CoreEngine.V5\DataAccess\DataContext.cs:line 389 
    at App.CoreEngine.V5.Calculation.CalculationEngine.Run() in C:\SourceCode\AppV1\Releases\Libraries\CoreEngine\CoreEngine.V5\Calculation\CalculationEngine.cs:line 243 
    at App.CoreEngine.V5.Processor.Milestone.BatchRunner.Run() in C:\SourceCode\AppV1\Releases\Libraries\CoreEngine\CoreEngine.V5\Processor\Milestone\BatchRunner.cs:line 171 

---> (Inner Exception #0) System.AggregateException: One or more errors occurred. 
---> System.Data.SqlClient.SqlException: Transaction (Process ID 89) was deadlocked on communication buffer resources with another process and has been chosen as the deadlock victim. Rerun the transaction. 
    at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection) 
    at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning() 
    at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) 
    at System.Data.SqlClient.SqlDataReader.HasMoreRows() 
    at System.Data.SqlClient.SqlDataReader.ReadInternal(Boolean setTimeout) 
    at App.CoreEngine.V5.DataAccess.SqlReader.Read(String readerDescription) in C:\SourceCode\Releases\Libraries\CoreEngine\CoreEngine.V5\DataAccess\SqlReader.cs:line 121 
    at App.CoreEngine.V5.DataAccess.DataContext.ExecuteQuery(PtQuery query, ValueStore`1 store, String readerDescription) in C:\SourceCode\AppV1\Releases\Libraries\CoreEngine\CoreEngine.V5\DataAccess\DataContext.cs:line 328 
    at App.CoreEngine.V5.DataAccess.DataContext.<>c__DisplayClass12.<GetCalculatedDataForCompare>b__f(Object _) in C:\SourceCode\AppV1\Releases\Libraries\CoreEngine\CoreEngine.V5\DataAccess\DataContext.cs:line 267 
    at System.Threading.Tasks.Task.Execute() 
    --- End of inner exception stack trace --- 
    at System.Threading.Tasks.Task.WaitAll(Task[] tasks, Int32 millisecondsTimeout, CancellationToken cancellationToken) 
    at CoreEngine.V5.DataAccess.DataContext.GetCalculatedDataForCompare() in C:\SourceCode\AppV1\Releases\Libraries\CoreEngine\CoreEngine.V5\DataAccess\DataContext.cs:line 276 
    at System.Threading.Tasks.Task`1.InvokeFuture(Object futureAsObj) 
    at System.Threading.Tasks.Task.Execute() 

EDIT - Właśnie dwukrotnie sprawdzane że DBCC 1222 jest włączona na serwerze to zdarzyło się, wpadłem dbcc tracestatus i otrzymała:

TraceFlag Status Global Session 
1222 1 1 0 
3605 1 1 0 

I nie ma nic w dziennikach sprawozdawczych zakleszczenia

+0

Czy wprowadzono jakieś zmiany kodu? Sever łatki? Czy możesz przetestować na przywróceniu, aby zobaczyć, czy plany wykonania chanes? Jaką wersję programu SQL Server? – gbn

+0

Nie było żadnych zmian ani łatek, które znam, ich SQL Server 2008 R2 – BrandonAGr

+0

Również była zmiana, która usunęła ConnectionTimeout z ciągu połączenia, który również był przyczyną problemu, więc musimy dodać ConnectionTimeout z powrotem jako [ opisane tutaj] (http: // stackoverflow.com/questions/6864672/failover-partner-behavior-for-sql-connectionstring-with-connectiontimeout), ale wydaje się mało prawdopodobne, aby było to związane z tym – BrandonAGr

Odpowiedz

7

Domyślam się, że plan wykonania używa teraz równoległości, podczas gdy wcześniej nie osiągnął progu kosztu.

Spróbuj MAXDOP 1 w zapytaniach

Edycja, po komentarzu

Należy również flagi śledzenia 1204.

TF 1222 daje wykres zakleszczenia, ale z tym „bufor zasobów komunikacja” impasu może nie są zaangażowane 2 obiekty (domyślam się, że to nie jest konflikt między indeksami a tabelami). Zobacz http://msdn.microsoft.com/en-us/library/ms178104.aspx

Istnieje również nieudokumentowane TF 1205, który daje więcej informacji w dzienniku błędów

+0

Plan z pewnością zawierał równoległość, głównym problemem jest to, że błąd ten wystąpił tylko 3 razy w ciągu ostatnich 5 miesięcy, ponieważ nie mogę rozsądnie odtworzyć problemu po prostu zmieniając ustawienia nie pozwolą mi ustalić, czy to się powtórzy. Główną irytującą rzeczą jest brak rejestrowania, gdy istnieje zakleszczenie, mimo że mam zestaw TraceFlag do rejestrowania zakleszczeń i zarejestrował on różne rodzaje zakleszczeń w przeszłości – BrandonAGr

+0

@BrandonAGr: Zobacz aktualizację proszę – gbn

1

W moim przypadku proces kasowania niektórych rekordów & następnie wstawiania rekordów w tabeli & to się dzieje ze środowiska wielowątkowego.

Musiałem dodać nieklastrowy indeks w tabeli na kolumnach używanych do usuwania, które rozwiązały mój problem.

+0

To działało również dla mnie. (Moja aplikacja była wieloma klientami łączącymi się z jedną bazą danych serwera SQL.) Ktoś ma pojęcie, dlaczego to rozwiązuje problem? – Jeff

+1

Usunięcie używa teraz indeksu zamiast skanowania tabeli. –

Powiązane problemy