如何列出死锁中的所有进程?

时间:2018-02-05 17:49:45

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

我目前收到错误:

  

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

根据我的研究理解,系统以最小的数据库访问权限来解决死锁问题。这不是理想的,因为保证此进程将进入错误状态。我处于这样一种情况,即进程等待死锁无法解决;这不是一个超时间关键的过程。

以下是我的问题:

  1. 是否可以通过连接字符串或其他配置来指示实体框架,以简单地停止最便宜的死锁进程而不是杀死它?如果是这样,怎么样?
  2. 是否可以报告所有死锁进程的堆栈跟踪,而不仅仅是被杀死的进程?否则我基本上不可能排除故障。
  3. 更新:我知道通过简单地暂停一个进程可能无法解决死锁问题。在这种情况下,只关注第二个问题。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:-3)

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

  

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

可以老一点,但有益于学习。