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