我们有一个数据库(我们称之为数据库A),它每隔几天就会变得无法使用,我们必须重新启动它。当我说无法使用意味着所有使用它的应用程序只是阻塞等待数据库响应,但它永远不会。
幸运的是,注意到使用SQL Server Management Studio对特定表执行SELECT语句似乎带来了一些记录,但在某些时候它会阻塞。
有趣的是,特定数据库上没有LOCKED或LOCKING进程。我发现该应用程序使用以下事务隔离:
ALLOW_SNAPSHOT_ISOLATION ON
这解释了为什么我们看不到锁定或锁定流程的权利?
我们有另一个数据库(我们称之为数据库B),它实际上具有相同的模式,我们从未遇到过这个问题。这些数据库之间的唯一区别是我之前提到过的隔离。这个使用默认的事务隔离,我们从来没有这个奇怪的数据库阻塞。但是数据库A每天还有更多的交易;更多。所以我能想到的是,在这种情况下,对于大量并发事务应该避免SNAPSHOT ISOLATION。
有人可能确认这很可能是导致问题的SNAPSHOT ISOLATION吗? 我的意思是我们没有锁,我们只是有一个数据库阻塞,没有实际的异常或某些东西可以帮助我们检测问题的根本原因。
我的假设是对的吗?我当然希望如此。
答案 0 :(得分:2)
您是否尝试过监控tempdb的使用情况? (AFAIK,ALLOWSNAPSHOT_ISOLATION ON严重依赖于tempdb,而标准锁定策略并非如此)
This MS technet page提供了有关如何执行此操作的一些提示(请参阅“监控空间”一节)
您也可以使用此快速查询来检查您的tempdb是否已满:
use tempdb
exec sp_spaceused