2012-02-06 83 views
3

遇到了一个问题,我希望有人能帮助给我一些方向。 在.NET 3.5和NHibernate 1.2上处理几年的应用程序。 过去一周,交易似乎随机锁定,一直有问题。我注意到NH有一个100000的command_timeout。现在我已经把它降到了30,因为100000看起来很疯狂!问题仍在发生。NHibernate SQL Server挂起进程

的SQL Server活动监视器显示时出现问题,通常处于暂停状态的阻塞事务。如果我杀死阻塞进程,那些进程被阻止,并且系统没有问题。

运行在阻挡过程的检查,我可以看到正在执行的大约SQL语句,是造成问题,但它是通过多系统的执行,在大多数的网页在检索普通数据的声明。

我觉得怎么样可能造成的?没有什么明显的...我们确实发布了一些小的改变,但是没有一个应该有这个效果。 Windows更新/服务包最近也在同一时间安装。 SQL/.NET SP更新可能是导致此问题的原因?

我知道有很多在这里,但试图给像我一样拥有的时刻。

新信息: 现在command_tinmeout已更新为30秒,超过此执行时间的查询会自动终止 - 或者我在活动监视器中看到。但是,似乎还有其他事情正在进行,因为重复查询也会因超时而失败。但是,如果我停止并启动应用程序池,则至少在一段时间内,所有内容都按常规开始工作。

回答

1

当你说这是你所看到的是阻塞之一,因为它通常执行的是最有可能是非常常见的查询,因此是最有可能是一个等待数据库锁。

什么隔离级别是在运行的数据库,如果它的开箱即用的设置是在大多数情况下是非常可行的性能,其切换到快照隔离避免读者等待作家。 More info on Snapshot isolation

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

+0

感谢您的信息。它看起来好像是有问题的查询主要是一个select查询,并且在任何时候最多可以从表中读取最多3行。什么是检查慢写查询的最佳方法? – TheITGuy 2012-02-06 19:01:53

+0

这取决于它很容易重现。 ín活动监视器寻找被列阻塞,然后你可以看到你的选择正在等待什么,另一种选择是跟踪或查看SQL服务器中的DMV中的历史记录 – jakobandersen 2012-02-07 05:55:10