NHibernate SQL Server挂起进程

3
我遇到了一个问题,希望有人能给我一些指导。 我正在处理一个应用程序,该应用程序已经使用.NET 3.5和NHibernate 1.2多年。在过去的一周中,交易似乎会随机锁定。我注意到NH的command_timeout为100000。现在我将其降低到30,因为100000看起来很疯狂!但问题仍在发生。
SQL Server Activity Monitor在出现问题时显示阻塞事务,通常处于SUSPENDED状态。如果我杀死阻塞进程,那些被阻塞的进程就会启动并且系统正常运行。
通过对阻塞进程进行检查,我可以看到大致执行的SQL语句引起了这个问题,但它是一个在整个系统中执行的语句,检索大多数页面上的常见数据。
我认为是什么原因导致了这个问题?没有明显的...我们发布了几个小更改,但没有一个应该有这种影响。最近安装了Windows更新/服务包。 SQL / .NET SP更新可能是此问题的原因吗?
现在已将command_tinmeout更新为30秒,超过此执行时间的查询将自动终止-至少在Activity Monitor中是这样。然而,似乎还有其他事情正在发生,因为重复查询也会超时失败。但是,如果我停止并重新启动应用程序池,则一切都会正常工作,至少有一段时间。
1个回答

1

当你说它是一个非常常见的查询,而你将其视为阻塞查询的时候,很可能是因为它被普遍执行,因此很可能是在数据库中等待锁定的查询。

如果数据库运行在隔离级别上,那么默认情况下,将其切换到快照隔离通常是非常可行的,以避免读者等待写入者。有关快照隔离的更多信息

考虑到造成这种情况的原因,可能是引入了一些缓慢的写入查询,数据变得非常大或者突然出现了大量的数据碎片。


谢谢提供信息。看起来,所涉及的查询主要是一个选择查询,并且在任何时候最多从表中读取3行。那么,检查缓慢的写入查询的最佳方法是什么? - TheITGuy
这要取决于重现的难易程度。在活动监视器中查找“被阻止”的列,然后您可以看到您的选择正在等待什么,另一个选项是跟踪或查看 SQL Server 中 DMV 的历史记录。 - jakobandersen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接