C# SqlException事务在通信缓冲区资源上死锁
我有一个必须执行大量数据库查询的服务器进程,它使用TPL并行运行。这一年来,它一直运转良好,直到今天,它在30分钟内两次坠毁,但以下情况除外: 事务(进程ID 89)在与另一个进程的通信缓冲区资源上被死锁,并被选为死锁受害者。重新运行事务 数据库被配置为记录任何死锁,但它没有记录任何东西,所以似乎这个死锁只发生在客户端 除了一个例外,我找不到此例外的任何引用 以前有人见过这个例外吗?或者知道我能做些什么来了解更多的信息吗C# SqlException事务在通信缓冲区资源上死锁,c#,.net,sql-server,timeout,C#,.net,Sql Server,Timeout,我有一个必须执行大量数据库查询的服务器进程,它使用TPL并行运行。这一年来,它一直运转良好,直到今天,它在30分钟内两次坠毁,但以下情况除外: 事务(进程ID 89)在与另一个进程的通信缓冲区资源上被死锁,并被选为死锁受害者。重新运行事务 数据库被配置为记录任何死锁,但它没有记录任何东西,所以似乎这个死锁只发生在客户端 除了一个例外,我找不到此例外的任何引用 以前有人见过这个例外吗?或者知道我能做些什么来了解更多的信息吗 ---> System.AggregateException: On
---> 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()
而且日志中没有报告死锁的内容我的猜测是,执行计划现在使用并行性,而以前它没有达到成本阈值 在查询中尝试MAXDOP 1 评论后编辑 您还需要跟踪标志1204 TF 1222给出了死锁图,但在这个“通信缓冲区资源”死锁中可能没有涉及2个对象(我猜这里不是索引/表冲突)。看
还有未记录的TF 1205,它在错误日志中提供了更多信息您是否可以尝试以下任一操作:
- 保持服务器端跟踪运行以捕获死锁事件
- 应用CU1并重试
- 打开另一个死锁捕获跟踪标志1205
我必须在用于删除的列的表上添加一个非聚集索引,这解决了我的问题。有代码更改吗?服务器补丁?您能否测试恢复以查看执行计划是否发生变化?什么版本的SQL Server?据我所知,没有任何更改或服务器补丁,它的SQL Server 2008 R2也有一个更改,从连接字符串中删除了ConnectionTimeout,这也是造成问题的原因,因此我们必须重新添加ConnectionTimeout,如下所示:,但这似乎不太可能与此相关。该计划当然包括并行性,主要问题是,在过去5个月内,该错误仅发生了3次,因为我无法合理地重现该问题,只是更改设置不允许我确定是否再次发生。最让人恼火的是在出现死锁时缺乏日志记录,尽管我将TraceFlag设置为记录死锁,而且它在过去记录了不同类型的死锁,这对我来说也很有效。(我的应用程序是多个客户端连接到一个SQL server数据库。)有人知道为什么这样可以解决问题吗?
TraceFlag Status Global Session
1222 1 1 0
3605 1 1 0