2011-07-20 63 views
13

我有一個服務器進程必須執行很多數據庫查詢,它使用TPL並行運行東西。今年全年一直工作正常,直到今天它在30分鐘內墜毀了兩次,但有以下例外。SqlException事務在通信緩衝區資源上死鎖

數據庫被配置爲記錄任何死鎖,但它沒有記錄任何東西,所以看起來好像這種死鎖只發生在客戶端?

我找不到任何對此例外的引用msdn forum post that doesn't provide any information

有沒有人見過這個例外?或者知道我能做些什麼才能找到更多關於它的信息?

---> 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() 

編輯 -我只是雙重檢查該DBCC 1222開啓這發生在服務器上,我跑dbcc tracestatus,並得到:

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

並沒有什麼在日誌報告死鎖

+0

任何代碼更改? Sever補丁?你可以測試恢復以查看執行計劃chanes嗎?什麼版本的SQL Server? – gbn

+0

我知道它沒有任何更改或服務器修補程序,它的SQL Server 2008 R2 – BrandonAGr

+0

此外還有一個更改,它將ConnectionTimeout從連接字符串中移除,這也導致了問題,所以我們必須將ConnectionTimeout添加回來,這裏描述](http:// stackoverflow。com/questions/6864672/failover-partner-behavior-for-sql-connectionstring-with-connectiontimeout),但這似乎不太可能與此有關 – BrandonAGr

回答

7

我的猜測是執行計劃現在使用並行性,而在它沒有達到成本閾值之前。在查詢

嘗試MAXDOP 1

編輯,註釋後

您還需要跟蹤標誌1204

TF 1222給人的僵局圖形,但這個「通信緩衝區資源」的僵局有可能不是涉及2個對象(我猜在這裏它不是索引/表衝突)。見http://msdn.microsoft.com/en-us/library/ms178104.aspx

也有無證TF 1205提供了更多的信息到錯誤日誌

+0

該計劃當然包括並行性,主要問題是這個錯誤只發生在3在過去的5個月中,由於我無法合理地重現問題,只是更改設置不會讓我確定它是否再次發生。主要惱人的是缺乏日誌記錄時,即使我有TraceFlag設置爲記錄死鎖,並在過去記錄了不同種類的死鎖 – BrandonAGr

+0

@BrandonAGr:請更新請 – gbn

1

在我的情況下,這個過程是刪除一些記錄&然後插入表中的記錄&這是從多線程環境中發生的。

我必須在用於刪除的列上的表上添加非聚集索引,這解決了我的問題。

+0

這也適用於我。 (我的應用程序是連接到單個SQL服務器數據庫的多個客戶端。)任何人都知道爲什麼這能解決問題? – Jeff

+1

刪除現在使用索引而不是表掃描.. –