【问题标题】:SqlException Transaction was deadlocked on communication buffer resourcesSqlException 事务在通信缓冲区资源上死锁
【发布时间】:2011-10-09 14:54:13
【问题描述】:

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

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

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

除了一个 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

日志中没有报告死锁

【问题讨论】:

  • 任何代码更改?打补丁?您可以测试恢复以查看执行计划是否更改?什么版本的 SQL Server?
  • 据我所知,没有任何更改或服务器补丁,它的 SQL Server 2008 R2
  • 还有一个更改从连接字符串中删除了 ConnectionTimeout,这也导致了问题,所以我们必须重新添加 ConnectionTimeout,如described here,但这似乎不太可能与这个

标签: c# .net sql-server timeout


【解决方案1】:

我的猜测是执行计划现在使用并行性,而之前它没有达到成本阈值。

在查询中尝试 MAXDOP 1

评论后编辑

您还需要跟踪标志 1204。

TF 1222 给出了死锁图,但是对于这种“通信缓冲区资源”死锁,可能不会涉及 2 个对象(我猜这里不是索引/表冲突)。见http://msdn.microsoft.com/en-us/library/ms178104.aspx

还有未记录的 TF 1205,它在错误日志中提供了更多信息

【讨论】:

  • 该计划当然包括并行性,主要问题是这个错误在过去 5 个月内只发生了 3 次,因为我无法合理地重现问题,只是更改设置无法让我确定如果它再次发生。主要烦人的事情是即使我将 TraceFlag 设置为记录死锁,当出现死锁时也没有记录,并且它过去记录了不同类型的死锁
【解决方案2】:

您是否可以尝试以下任何一种方法:

【讨论】:

    【解决方案3】:

    在我的例子中,这个过程是删除一些记录,然后在表中插入记录,它是在多线程环境中发生的。

    我必须在用于删除的列上的表上添加一个非聚集索引,这解决了我的问题。

    【讨论】:

    • 这对我也有用。 (我的应用程序是连接到单个 SQL 服务器数据库的多个客户端。)有人知道为什么这可以解决问题吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-15
    • 1970-01-01
    • 2017-09-06
    相关资源
    最近更新 更多