我遇到了一个问题,即无法对数据库中的单个表执行任何查询。桌子陷入了完全僵局。我检查了sp_whoisactive
的答案,发现了以下内容。
此会话ID为172的表上的简单SELECT
正在等待会话ID为478的该表上的DELETE
查询,而会话ID为478的该表正在等待INDEX REORGANIZE
会话ID 207,它正在此表上等待会话ID 598的简单SELECT
。
杀死598次会话后,一切立即完成。之后,执行相同的查询将表保持在SSMS单独窗口中的死锁中仅需2秒钟。我四处询问,此查询由Excel文件执行。显然,我们有许多Excel文件浮动,它们围绕着我们的SQL数据库运行查询。显然,这是非常糟糕的做法,因为可以在内部找到连接字符串,但是对于所有旧版而言,直到修复之前,它都是这样。
在谷歌搜索时,我发现lot of resources about Excel实际上是在锁定表。现在,就我对锁的有限了解而言,如果由会话ID 598执行的查询实际上将锁定表,则它仅应在查询期间进行。而且由于单独运行查询只花了几秒钟,所以我不知道它如何运行超过12个小时。如果我可以相信sp_whoisactive
的结果,那就没有其他了。那为什么不完整呢?
在我建议向Excel文件中的每个查询中添加WITH(NOLOCK)
之类的东西之前,这只是一个补丁而不是解决方案,我想弄清楚为什么会发生这种情况,以便将来避免这种情况。是什么原因导致这种死锁?如何避免死锁?
答案 0 :(得分:0)
Excel将在查询过程中一直进行页面锁定,直到查询被释放为止(这基本上是在电子表格关闭时)。因此,如果用户在一夜之间或整整一天未打开电子表格,则该表将被锁定。我们遇到了同样的问题,我们试图用SSRS报告代替有问题的电子表格,但是由于Excel文件做了很多SSRS不能做的其他事情,因此工作人员的运气不太好。