2011-07-20 59 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

删除现在使用索引而不是表扫描.. –