【发布时间】:2018-02-05 17:49:44
【问题描述】:
我目前收到错误:
System.Data.SqlClient.SqlException:事务(进程 ID 109)与另一个进程在锁资源上死锁,并已被选为死锁牺牲品。重新运行事务。
从我的研究中了解到,系统正在杀死对数据库的访问量最少的进程以解决死锁。这并不理想,因为它保证此进程将进入错误状态。我处于这样一种情况,即进程等待死锁解决是不可取的;这不是一个时间紧迫的过程。
这是我的问题:
- 是否可以通过连接字符串或其他配置指示 Entity Framework 简单地停止成本最低的死锁进程而不是杀死它?如果有,怎么做?
- 是否可以报告所有死锁进程的堆栈跟踪,而不仅仅是被杀死的进程?否则我基本上不可能排除故障。
更新:我了解仅通过停止一个进程可能无法解决死锁。在这种情况下,只需关注第二个问题。
【问题讨论】:
-
它是一个死锁的事实意味着它永远不会自行解决。必须杀死一个进程。
-
这确实是一个 SQL Server 问题,因此通过 a) 使用 SQL Server 对其进行标记,或 b) 将其移动到 dba.stackexchange,您可能会得到更好的答案
-
您可以在 dbcontext 上设置 DEADLOCK_PRIORTY。但是您确实应该首先查看您的流程,了解为什么会出现死锁。
-
@Fran 对,我只是不知道该怎么做,除非我知道什么是死锁的(除非我只是随意研究代码),因此关于如何确定这个的问题跨度>
-
数据库是引发错误的那个,所以我建议尝试从数据库中找出问题,而不是从客户端中找出问题(去源头,而不是“受害者”) .如果这是 SQL Server,请查看 SQL Profiler 以查看活动。要查找竞争进程,可以根据您的 dbms 的风格使用 SQL 查询来执行此操作。
标签: c# sql-server entity-framework deadlock