2009-12-20 85 views
2

我们有一个数据库(我们称之为数据库A),它每隔几天就会变得不可用,我们必须重新启动它。当我说不可用时意味着所有使用它的应用程序都会阻止等待数据库响应,但它永远不会。SQL Server 2005在没有锁定或锁定进程的情况下被阻塞

幸运的是,有人发现,使用SQL Server Management Studio对特定表执行SELECT语句似乎会带来一些记录,但在某些时候它会阻止。

有趣的是,特定数据库上没有LOCKED或LOCKING进程。我发现该应用程序使用以下事务隔离:

ALLOW_SNAPSHOT_ISOLATION ON 

这就解释了为什么我们不能看到锁定或锁定的过程吧?

我们有另一个数据库(让我们称之为数据库B),它实际上具有相同的模式,我们从来没有遇到过这个问题。这些数据库之间唯一的区别是我前面提到的隔离。这个使用默认的事务隔离,我们从来没有过这种数据库阻塞的奇怪事情。但数据库A的每天开放交易量也更多;更多。所以我能想到的是,在这种情况下,应避免大量并发事务的SNAPSHOT ISOLATION。

有人可以证实,最有可能它是SNAPSHOT ISOLATION导致的问题? 我的意思是我们没有锁,我们只是有一个数据库阻塞,没有实际的例外,或者会帮助我们检测问题的根本原因。

我的假设是否正确?我当然希望如此。

回答

2

您是否尝试过监视tempdb的使用情况? (据我所知,ALLOWSNAPSHOT_ISOLATION ON很大程度上依赖于tempdb中,这是不是标准的锁定策略的情况下)

This MS technet page对如何做到这一点(请参见“监视空间”)

你也可以一些小技巧使用这个快速查询来检查你的tempdb是不是已满:

use tempdb 
    exec sp_spaceused 
+0

你能给我一些关于什么应该监视tempdb的提示吗? – DaTroop 2009-12-20 15:34:34

+0

刚更新我的答案... – Brann 2009-12-20 16:55:28

+0

这将如何帮助? 下面是该SP该文档: 显示的行中的当前数据库中的数,保留的磁盘空间,并且由表中使用的磁盘空间,索引视图,或服务代理队列,或显示保留和使用的磁盘空间由整个数据库 我的意思是这将显示由tempdb分配的空间。 我的意思是我还可以做些什么来监视数据库A的速度非常慢? – DaTroop 2009-12-21 19:33:48