【问题标题】:Console program in production deadlocked生产中的控制台程序死锁
【发布时间】:2012-01-25 11:25:02
【问题描述】:

我的生产服务器上有一个程序,它返回了这个错误:

  1. 我主要关心的是我的程序是否在生产服务器上,为什么 它在错误中返回我的源代码的位置?

  2. 还有什么是调试此类死锁错误的最佳方法和 是服务器资源不足造成的吗?

事务(进程 ID 73)在线程上死锁 |沟通 与另一个进程缓冲资源,并已被选为 僵局受害者。重新运行事务。 : 在 System.Data.SqlClient.SqlConnection.OnError(SqlException 异常, 布尔中断连接)

在 System.Data.SqlClient.SqlInternalConnection.OnError(SqlException 异常,布尔型 breakConnection)

在 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)

在 System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler、SqlDataReader 数据流、 BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)

在 System.Data.SqlClient.SqlDataReader.HasMoreRows()

在 System.Data.SqlClient.SqlDataReader.ReadInternal(Boolean 设置超时)

在 System.Data.SqlClient.SqlDataReader.Read()

在 Microsoft.Data.Extensions.Materializer`1.d__a.MoveNext()

在 Microsoft.Data.Extensions.Materializer`1.d__0.MoveNext()

在 System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()

在 System.Collections.Generic.List1..ctor(IEnumerable1 收藏)

在 System.Linq.Enumerable.ToList[TSource](IEnumerable`1 源)

在 Console.Export.DataProvider.ExportData(IEnumerable`1 活动参数)在 D:\Documents 和 Settings\USER\Desktop\11_16_2011\ITS\Console\Export\DataProvider.cs:line 44

在 D:\Documents 中的 Console.Export.WarDataProvider.GetValues() 和 Settings\USER\Desktop\11_16_2011\ITS\Console\Export\DataProvider.cs:line 31

在 Console.Export.ExportEngine.Export(IDataProvider provider) 中 D:\文档和 Settings\USER\Desktop\11_16_2011\ITS\Console\Export\ExportEngine.cs:line 25

【问题讨论】:

  • 这个程序是在不同的线程中发出多个 SQL 命令,还是在尝试使用 SQL DB 时与其他软件发生冲突?
  • 死锁与缺乏资源没有直接关系。简单地说:相互竞争的 SPID 都有对方想要的锁
  • @turowicx 我不相信它正在运行多个线程,但是它一个接一个地依次运行多个更新。

标签: c# linq sql-server-2005 deadlock


【解决方案1】:

可以使用 Sql Profiler 对死锁进行适当检查,其中包含一些事件

但是

它并未显示所有收集到的有用信息 - 将事件保存为 xml 并在此 xml 中挖掘可以为您提供有关问题的更多信息

或

您可以使用 sql server 的内部死锁日志记录到它自己的错误日志中。该行为由跟踪标志 1222 和 1204 控制。

和

如果涉及的死锁语句之一使用 table 或 pk 扫描,通常正确的索引可以解决死锁问题

【讨论】:

    【解决方案2】:

    当你编译你的程序时,你是在调试而不是发布配置中编译的吗?如果您进行调试构建并将文件部署到服务器,那么它将显示额外的诊断信息,这在这种情况下可能是一件好事。

    • 至于最好的调试方法,我建议你做两件事: 使用try, catch blocks 捕获并处理您的错误 程序。
    • 将此程序与与之发生死锁的程序进行比较。你有一个 deadly embrace 有时可以通过更改顺序来解决 事务中引用了哪些表。

    这是handling Deadlocks 的指导。

    【讨论】:

    • 啊,是的,因为它准确地告诉我哪些行失败了。我只是有点担心它实际上是在尝试访问我的机器来运行。
    猜你喜欢
    • 2021-12-14
    • 2018-08-22
    • 1970-01-01
    • 2013-12-28
    • 1970-01-01
    • 1970-01-01
    • 2014-04-10
    • 2017-08-15
    • 1970-01-01
    相关资源
    最近更新 更多