Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SqlException事务在通信缓冲区资源上死锁_C#_.net_Sql Server_Timeout - Fatal编程技术网

C# SqlException事务在通信缓冲区资源上死锁

C# SqlException事务在通信缓冲区资源上死锁,c#,.net,sql-server,timeout,C#,.net,Sql Server,Timeout,我有一个必须执行大量数据库查询的服务器进程,它使用TPL并行运行。这一年来,它一直运转良好,直到今天,它在30分钟内两次坠毁,但以下情况除外: 事务(进程ID 89)在与另一个进程的通信缓冲区资源上被死锁,并被选为死锁受害者。重新运行事务 数据库被配置为记录任何死锁,但它没有记录任何东西,所以似乎这个死锁只发生在客户端 除了一个例外,我找不到此例外的任何引用 以前有人见过这个例外吗?或者知道我能做些什么来了解更多的信息吗 ---> System.AggregateException: On

我有一个必须执行大量数据库查询的服务器进程,它使用TPL并行运行。这一年来,它一直运转良好,直到今天,它在30分钟内两次坠毁,但以下情况除外:

事务(进程ID 89)在与另一个进程的通信缓冲区资源上被死锁,并被选为死锁受害者。重新运行事务

数据库被配置为记录任何死锁,但它没有记录任何东西,所以似乎这个死锁只发生在客户端

除了一个例外,我找不到此例外的任何引用

以前有人见过这个例外吗?或者知道我能做些什么来了解更多的信息吗

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