數據庫發生死鎖,SQL Server 2008R2
最近幾天,我的生產站點出現了重大問題,結果出現了死鎖,每半小時可能會出現 50-60 個死鎖。為了保持網站執行,我設置了一個快速修復:
ALLOW_SNAPSHOT_ISOLATION ON
我相信我的日誌文件會比以前增長得更快嗎?
是否有不同類型的隔離,是否可以將隔離設置為僅導致死鎖的 2 個表?
::更新::
::2013-03-21 15:09::
我可以查詢死鎖中涉及的程序ID嗎?
select object_name()
總是返回 null
在不首先測試應用程序的情況下在生產伺服器上啟用快照隔離是一種相當高風險的策略,但如果您似乎已經僥倖成功,那麼恭喜您。
快照隔離的副作用往往與 tempdb 而不是事務日誌有關,例如參見http://msdn.microsoft.com/en-us/library/tcbchxcb%28v=vs.110%29.aspx。
最好的辦法是查看訪問這兩個表的程式碼,看看是否可以糾正那裡的問題。
我認為在這種情況下你最好的朋友是由 Adam Machanic 開發的 sp_whoisactive;您可以從 Brent Ozar 的網站獲得相同的資訊。急救人員套件
我有類似的情況,我曾經經常被阻塞,而我的應用程序過去常常處於無響應狀態。我沒有直接更改隔離級別,而是僅啟用了已送出的讀取快照。以下是執行此操作的命令:
--Query to check current state of database SELECT name, is_read_committed_snapshot_on FROM sys.databases where name = ‘DB_NAME’ --Query to modify the database: ALTER DATABASE DB_NAME SET SINGLE_USER WITH ROLLBACK IMMEDIATE GO ALTER DATABASE DB_NAME SET READ_COMMITTED_SNAPSHOT ON WITH ROLLBACK IMMEDIATE; GO
請記住,此更改需要在生產伺服器上停機。讀取送出的快照隔離啟用有時需要更改程式碼,這可能會給您帶來麻煩。如果它在你的情況下工作,那麼它非常好。您可以在 Kendra 的 Little Kendra 網站隔離級別上閱讀更多相關資訊
我希望以上資訊對您或您有所幫助。如果您使用任何數據庫監控工具,例如 Solarwinds DPA 或 Whitesands Proactive DBA;這在警報方面可能有很大幫助。
至於您的第二個問題 - 是的,您可以在會話級別更改隔離級別,但是我不太確定表級別。
您可以在此論壇上的Database Blocking上參考我的問題