2

我们有一个数据库(我们称之为数据库 A)每隔几天就会变得不可用,我们必须重新启动它。当我说不可用意味着所有使用它的应用程序只是阻塞在那里等待数据库响应,但它永远不会响应。

幸运的是,我们注意到使用 SQL Server Management Studio 对特定表执行 SELECT 语句似乎会带来一些记录,但在某些时候它会阻塞。

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

ALLOW_SNAPSHOT_ISOLATION ON

这解释了为什么我们看不到 Locked 或 Locking 进程对吗?

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

有人可以确认很可能是导致问题的快照隔离吗?我的意思是我们没有锁,我们只是有一个数据库阻塞,没有实际的异常或有助于我们检测问题根本原因的东西。

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

4

1 回答 1

2

您是否尝试过监控您的 tempdb 使用情况?(AFAIK,ALLOWSNAPSHOT_ISOLATION ON 严重依赖 tempdb,标准锁定策略并非如此)

此 MS technet 页面提供了一些有关如何执行此操作的提示(请参阅“监控空间”部分)

您还可以使用此快速查询来检查您的 tempdb 是否已满:

   use tempdb
   exec sp_spaceused
于 2009-12-20T14:14:39.917 回答