2009-12-20 120 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