【问题标题】:How to list all processes in a deadlock?如何列出死锁中的所有进程?
【发布时间】:2018-02-05 17:49:44
【问题描述】:

我目前收到错误:

System.Data.SqlClient.SqlException:事务(进程 ID 109)与另一个进程在锁资源上死锁,并已被选为死锁牺牲品。重新运行事务。

从我的研究中了解到,系统正在杀死对数据库的访问量最少的进程以解决死锁。这并不理想,因为它保证此进程将进入错误状态。我处于这样一种情况,即进程等待死锁解决是不可取的;这不是一个时间紧迫的过程。

这是我的问题:

  1. 是否可以通过连接字符串或其他配置指示 Entity Framework 简单地停止成本最低的死锁进程而不是杀死它?如果有,怎么做?
  2. 是否可以报告所有死锁进程的堆栈跟踪,而不仅仅是被杀死的进程?否则我基本上不可能排除故障。

更新:我了解仅通过停止一个进程可能无法解决死锁。在这种情况下,只需关注第二个问题。

【问题讨论】:

  • 它是一个死锁的事实意味着它永远不会自行解决。必须杀死一个进程。
  • 这确实是一个 SQL Server 问题,因此通过 a) 使用 SQL Server 对其进行标记,或 b) 将其移动到 dba.stackexchange,您可能会得到更好的答案
  • 您可以在 dbcontext 上设置 DEADLOCK_PRIORTY。但是您确实应该首先查看您的流程,了解为什么会出现死锁。
  • @Fran 对,我只是不知道该怎么做,除非我知道什么是死锁的(除非我只是随意研究代码),因此关于如何确定这个的问题跨度>
  • 数据库是引发错误的那个,所以我建议尝试从数据库中找出问题,而不是从客户端中找出问题(去源头,而不是“受害者”) .如果这是 SQL Server,请查看 SQL Profiler 以查看活动。要查找竞争进程,可以根据您的 dbms 的风格使用 SQL 查询来执行此操作。

标签: c# sql-server entity-framework deadlock


【解决方案1】:

您可以从 system_health XEvent 会话中获取死锁信息。

https://docs.microsoft.com/en-us/sql/relational-databases/extended-events/use-the-system-health-session

或者使用 Azure SQL 数据库的自定义 XEvent 会话,如下所示:

CREATE EVENT SESSION [deadlocks] ON DATABASE 
ADD EVENT sqlserver.database_xml_deadlock_report(
    ACTION(sqlserver.tsql_stack))
ADD TARGET package0.ring_buffer
WITH (STARTUP_STATE=ON)
GO

【讨论】:

    【解决方案2】:

    我推荐 WinDbg,一个多用途的 win 调试工具。 此外,你可以试试这个

    https://www.codeproject.com/Articles/20459/Deadlock-Detection-in-Existing-Code

    可能有点老了,但很适合学习。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-25
      • 2012-04-04
      • 2013-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多