【问题标题】:NHibernate SQL Server Suspended ProcessesNHibernate SQL Server 挂起的进程
【发布时间】:2012-02-06 10:49:39
【问题描述】:

遇到了一个问题,我希望有人可以帮助给我一些指导。 在 .NET 3.5 和 NHibernate 1.2 上开发一个使用了几年的应用程序。 过去一周一直遇到问题,交易似乎随机锁定。我注意到 NH 的 command_timeout 为 100000。我现在将其降低到 30,因为 100000 看起来很疯狂!问题仍在发生。

当问题发生时,SQL Server 活动监视器会显示一个阻塞事务,通常处于 SUSPENDED 状态。如果我杀死阻塞进程,那些被阻塞的进程就会关闭并且系统很好。

对阻塞进程运行检查,我可以看到正在执行的大约导致问题的 SQL 语句,但它是通过系统的大部分执行的语句,检索大多数页面的公共数据。

我认为这可能是什么原因造成的?没有什么明显的……我们确实发布了一些小改动,但它们都不应该有这种效果。最近也安装了 Windows 更新/服务包。 SQL/.NET SP 更新是否会导致此问题?

我知道这里有很多东西,但我现在尽力付出。

新信息: 现在 command_tinmeout 已更新为 30 秒,超过此执行时间的查询将自动终止 - 或者我在 Activity Monitor 中看到。但是,似乎发生了其他事情,因为重复查询也因超时而失败。但是,如果我停止并启动应用程序池,一切都会开始正常工作,至少在一段时间内。

【问题讨论】:

    标签: .net sql-server-2005 nhibernate process locking


    【解决方案1】:

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

    数据库运行的隔离级别是什么,如果它是开箱即用的设置,在大多数情况下,将其切换到快照隔离以避免读取器等待写入器对于性能来说是非常可行的。 More info on Snapshot isolation

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

    【讨论】:

    • 感谢您的信息。看起来有问题的查询主要是一个选择查询,并且在任何时间点最多从表中读取 3 行。检查慢写查询的最佳方法是什么?
    • 这取决于复制的难易程度。 Ín 活动监视器查找被阻止的列,然后您可以看到您的选择正在等待什么,另一个选项是跟踪或查看 SQL Server 中 DMV 中的历史记录
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-13
    • 2018-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多