Transaction ABORTed due to Deadlock
最近,当我们去更新我们的一个表中的记录时,我们遇到了错误。有东西在这张桌子上加了一把锁,它没有被释放,但我花了几天的时间试图追踪它,但它仍然让我难以捉摸。
虽然错误是随机的,但我确实知道我需要重复哪些重复循环才能最终触发它。但是,我查询了 dbc.DBQLogTbl 并查看了在错误发生前后 2 分钟执行的所有 SQL,并且在没有访问锁的情况下似乎没有从任何表中进行选择。此外,在错误发生后,我将按 F5 将 Web 表单重新发布回服务器以重复完全相同的更新集,它会起作用。
我的预感是我们的 ASP.NET 应用程序之外的某个进程正在锁定表,因为我已经检查了我们的应用程序正在执行的所有 SQL。我认为必须有一种方法来找出执行了哪些特定的 SQL 并在表上放置了锁。
2012 年 8 月 9 日附加信息: 根据我在查询dbc.DBQLogTbl
和订购时看到的内容,在同一事务中按此顺序发生以下所有情况firststeptime
:
- 更新员工表
- 锁定访问行 select * from employeesecurity where empid = X (执行此操作以获取当前员工记录以查看是否有任何更改)
- 如果有变化,更新上述员工安全记录
- 更新employeeconfig表(这里总是出现死锁错误)
我之前没有提到这一点,但是死锁错误发生在我根本没有从中选择的表上。当页面加载时,我确实从一个employeeconfig 视图中读取,但locking row for access
在视图中指定。
回答 Rob 的 4 个问题:
- 这只是一笔交易。
- 正如我在最新更新中所述,被锁定的表甚至不是从中选择的表。
- 所有查询使用
locking row for access
- 我们从视图中选择
employeeconfig
。此视图使用 . 从employeeconfig
表中进行选择locking row for access
。locking row for access
我们在查询视图本身时不使用。
至于处理死锁,我宁愿没有代码只是尝试重新提交它,因为这似乎是一个需要修复的问题。正如你所说,Rob,我的访问权限可能dbc.DBQLogTbl
是有限的,所以我可能无法看到正在发生的一切。我一直在联系 DBA,今天将再次跟进。