解决SQL server2005数据库死锁的经验心得
????????前段時間提到的"sql server 2005 死鎖解決探索",死鎖嚴重,平均每天會發(fā)生一次死鎖,在解決和處理SQL server2005死鎖中查了很多資料和想了很多辦法,后來我們就使用了以下方法:?
???
?? 1,將數據庫隔離級別改成行版本控制隔離級別。(沒有了共享鎖死鎖)?
???
?? 2,重建和優(yōu)化索引,優(yōu)化SQL語句和采用分區(qū)視圖等方法。提高訪問速度。(減少了鎖定時間)?
???
?? 3,水平拆分表(分區(qū))并在程序讀寫時盡量做到分區(qū)消除,減少讀寫的行數,降低鎖定升級的頻率和時間。 (減少鎖的升級)?
??對為何出現死鎖和怎樣較少死鎖有了進一步認識,在這里和大家一起分享:?
???
???
???
?? SQL Server 鎖類型?
?? 在數據庫中主要存在兩種鎖: S(共享鎖)和X(排他鎖)?
???
?? S(共享鎖):在執(zhí)行查詢數據時,SQL server會將行鎖定,這時只能查詢數據,刪,改被阻塞,?
???
?? X(排他鎖):在插入和刪除數據時,將行鎖定,這時增,刪,改都被阻塞?
???
?? 以上兩種鎖都會引起死鎖:?
???
?? 死鎖定義:在兩個或多個任務中,如果每個任務鎖定了其他任務試圖鎖定的資源,此時會造成這些任務永久阻塞,從而出現死鎖?
???
???
???
?? 這里模擬一下死鎖環(huán)境:?
???
?? 建立環(huán)境:?
??----死鎖例子,建立表數據?
??create table [dbo].[[zping.com1]]](?
??A varchar(2)?
??,B varchar(2)?
??,C varchar(2))?
???
??--插入數據?
??insert into [dbo].[[zping.com1]]]?
??select 'a1','b1','c1'?
??union all select 'a2','b2','c2'?
??union all select 'a3','b3','c3'?
???
??--建立表數據?
??create table [dbo].[[zping.com2]]]?
??(D varchar(2)?
??,E varchar(2))?
???
?? --插入數據?
??insert into [dbo].[[zping.com2]]]?
??select 'd1','e1'?
??union all select 'd2','e2'?
???
???
???
?? 1. 1 排他鎖引起的死鎖?
?? 執(zhí)行語句:?
???
??begin tran?
??update [dbo].[[zping.com2]]]?
??set D='d5'?
??where E='e1'?
??waitfor delay '00:00:05'?
???
??update [dbo].[[zping.com1]]]?
??set A='aa'?
??where B='b2'?
???
???
??begin tran?
??update [dbo].[[zping.com1]]]?
??set A='aa'?
??where B='b2'?
??waitfor delay '00:00:05'?
???
??update [dbo].[[zping.com2]]]?
??set D='d5'?
??where E='e1'?
???
???
?? 新建兩個窗口,在5秒鐘內執(zhí)行上面語句,不久就會出現死鎖提示。(結束后記住要把事務回滾啊)?
???
?? 1.2 共享鎖引起的死鎖?
??begin tran?
??update [dbo].[[zping.com2]]]?
??set D='d5'?
??where E='e1'?
??waitfor delay '00:00:05'?
???
??select * from [dbo].[[zping.com1]]]?
??where B='b2'?
???
???
??begin tran?
??update [dbo].[[zping.com1]]]?
??set A='aa'?
??where B='b2'?
??waitfor delay '00:00:05'?
???
??select * from [dbo].[[zping.com2]]]?
??where E='e1'?
???
???
?? 新建兩個窗口,在5秒鐘內執(zhí)行上面語句。不久就會出現死鎖提示。(結束后記住要把事務回滾啊)?
???
???
???
?? 知道死鎖產生的原因,在生產環(huán)境產生的死鎖就類似這兩種情況。?
???
???
???
?? 后來在網上查閱了很多資料,包括sql server 2005的幫助文檔。總結有以下有主要幾點:?
???
?? 1,降低隔離級別或者使用行版本控制隔離級別?
???
?? 2,提高數據的訪問速度?
???
?? 3,減少事務長度?
???
?? 4,將按順序訪問熱點表(如將訪問頻繁的表放在最后訪問)?
???
???
???
?? 遇到的困難?
?? 但在我們這次優(yōu)化中,有些是不太好處理的 如:?
???
?? 1,減少事務長度,事務的大小不是我們來決定的,是由業(yè)務邏輯來決定的(來自tom的《Oracle 9i/10g深入內部體系機構》中)?
???
?? 2,按順序訪問熱點表,我們發(fā)現代碼中方法間互相調用很頻繁,經常一個表調用多次,要修改表的訪問順序是比較困難的。?
總結
以上是生活随笔為你收集整理的解决SQL server2005数据库死锁的经验心得的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 问题-[Delphi]MainFrame
- 下一篇: Codeforces 432E Squa