


SQL Server 死鎖處理和優(yōu)化
添加時(shí)間:2014-5-6 16:57:34
添加:
思海網(wǎng)絡(luò)
sql server 鎖類型
在數(shù)據(jù)庫(kù)中主要存在兩種鎖: S(共享鎖)和X(排他鎖)
S(共享鎖):在執(zhí)行查詢數(shù)據(jù)時(shí),sql server會(huì)將行鎖定,這時(shí)只能查詢數(shù)據(jù),刪,改被阻塞,
X(排他鎖):在插入和刪除數(shù)據(jù)時(shí),將行鎖定,這時(shí)增,刪,改都被阻塞
以上兩種鎖都會(huì)引起死鎖:
死鎖定義:在兩個(gè)或多個(gè)任務(wù)中,如果每個(gè)任務(wù)鎖定了其他任務(wù)試圖鎖定的資源,此時(shí)會(huì)造成這些任務(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í)行語(yǔ)句:
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'
新建兩個(gè)窗口,在5秒鐘內(nèi)執(zhí)行上面語(yǔ)句,不久就會(huì)出現(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'
新建兩個(gè)窗口,在5秒鐘內(nèi)執(zhí)行上面語(yǔ)句。不久就會(huì)出現(xiàn)死鎖提示。(結(jié)束后記住要把事務(wù)回滾。
知道死鎖產(chǎn)生的原因,在生產(chǎn)環(huán)境產(chǎn)生的死鎖就類似這兩種情況。
后來(lái)在網(wǎng)上查閱了很多資料,包括sql server 2005的幫助文檔?偨Y(jié)有以下有主要幾點(diǎn):
1,降低隔離級(jí)別或者使用行版本控制隔離級(jí)別
2,提高數(shù)據(jù)的訪問(wèn)速度
3,減少事務(wù)長(zhǎng)度
4,將按順序訪問(wèn)熱點(diǎn)表(如將訪問(wèn)頻繁的表放在最后訪問(wèn))
遇到的困難
但在我們這次優(yōu)化中,有些是不太好處理的 如:
1,減少事務(wù)長(zhǎng)度,事務(wù)的大小不是我們來(lái)決定的,是由業(yè)務(wù)邏輯來(lái)決定的(來(lái)自tom的《Oracle 9i/10g深入內(nèi)部體系機(jī)構(gòu)》中)
2,按順序訪問(wèn)熱點(diǎn)表,我們發(fā)現(xiàn)代碼中方法間互相調(diào)用很頻繁,經(jīng)常一個(gè)表調(diào)用多次,要修改表的訪問(wèn)順序是比較困難的。
采用的方法
后來(lái)我們就使用了以下方法:
1,將數(shù)據(jù)庫(kù)隔離級(jí)別改成行版本控制隔離級(jí)別。(沒(méi)有了共享鎖死鎖)
2,重建和優(yōu)化索引,優(yōu)化SQL語(yǔ)句和采用分區(qū)視圖等方法。提高訪問(wèn)速度。(減少了鎖定時(shí)間)
3,水平拆分表(分區(qū))并在程序讀寫時(shí)盡量做到分區(qū)消除,減少讀寫的行數(shù),降低鎖定升級(jí)的頻率和時(shí)間。 (減少鎖的升級(jí))
通過(guò)4個(gè)月左右的運(yùn)行,系統(tǒng)就發(fā)生過(guò)一次死鎖,比以前大大降低。
在數(shù)據(jù)庫(kù)中主要存在兩種鎖: S(共享鎖)和X(排他鎖)
S(共享鎖):在執(zhí)行查詢數(shù)據(jù)時(shí),sql server會(huì)將行鎖定,這時(shí)只能查詢數(shù)據(jù),刪,改被阻塞,
X(排他鎖):在插入和刪除數(shù)據(jù)時(shí),將行鎖定,這時(shí)增,刪,改都被阻塞
以上兩種鎖都會(huì)引起死鎖:
死鎖定義:在兩個(gè)或多個(gè)任務(wù)中,如果每個(gè)任務(wù)鎖定了其他任務(wù)試圖鎖定的資源,此時(shí)會(huì)造成這些任務(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í)行語(yǔ)句:
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'
新建兩個(gè)窗口,在5秒鐘內(nèi)執(zhí)行上面語(yǔ)句,不久就會(huì)出現(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'
新建兩個(gè)窗口,在5秒鐘內(nèi)執(zhí)行上面語(yǔ)句。不久就會(huì)出現(xiàn)死鎖提示。(結(jié)束后記住要把事務(wù)回滾。
知道死鎖產(chǎn)生的原因,在生產(chǎn)環(huán)境產(chǎn)生的死鎖就類似這兩種情況。
后來(lái)在網(wǎng)上查閱了很多資料,包括sql server 2005的幫助文檔?偨Y(jié)有以下有主要幾點(diǎn):
1,降低隔離級(jí)別或者使用行版本控制隔離級(jí)別
2,提高數(shù)據(jù)的訪問(wèn)速度
3,減少事務(wù)長(zhǎng)度
4,將按順序訪問(wèn)熱點(diǎn)表(如將訪問(wèn)頻繁的表放在最后訪問(wèn))
遇到的困難
但在我們這次優(yōu)化中,有些是不太好處理的 如:
1,減少事務(wù)長(zhǎng)度,事務(wù)的大小不是我們來(lái)決定的,是由業(yè)務(wù)邏輯來(lái)決定的(來(lái)自tom的《Oracle 9i/10g深入內(nèi)部體系機(jī)構(gòu)》中)
2,按順序訪問(wèn)熱點(diǎn)表,我們發(fā)現(xiàn)代碼中方法間互相調(diào)用很頻繁,經(jīng)常一個(gè)表調(diào)用多次,要修改表的訪問(wèn)順序是比較困難的。
采用的方法
后來(lái)我們就使用了以下方法:
1,將數(shù)據(jù)庫(kù)隔離級(jí)別改成行版本控制隔離級(jí)別。(沒(méi)有了共享鎖死鎖)
2,重建和優(yōu)化索引,優(yōu)化SQL語(yǔ)句和采用分區(qū)視圖等方法。提高訪問(wèn)速度。(減少了鎖定時(shí)間)
3,水平拆分表(分區(qū))并在程序讀寫時(shí)盡量做到分區(qū)消除,減少讀寫的行數(shù),降低鎖定升級(jí)的頻率和時(shí)間。 (減少鎖的升級(jí))
通過(guò)4個(gè)月左右的運(yùn)行,系統(tǒng)就發(fā)生過(guò)一次死鎖,比以前大大降低。
關(guān)鍵字:數(shù)據(jù)庫(kù)、SQL Server、死鎖
新文章:
- CentOS7下圖形配置網(wǎng)絡(luò)的方法
- CentOS 7如何添加刪除用戶
- 如何解決centos7雙系統(tǒng)后丟失windows啟動(dòng)項(xiàng)
- CentOS單網(wǎng)卡如何批量添加不同IP段
- CentOS下iconv命令的介紹
- Centos7 SSH密鑰登陸及密碼密鑰雙重驗(yàn)證詳解
- CentOS 7.1添加刪除用戶的方法
- CentOS查找/掃描局域網(wǎng)打印機(jī)IP講解
- CentOS7使用hostapd實(shí)現(xiàn)無(wú)AP模式的詳解
- su命令不能切換root的解決方法
- 解決VMware下CentOS7網(wǎng)絡(luò)重啟出錯(cuò)
- 解決Centos7雙系統(tǒng)后丟失windows啟動(dòng)項(xiàng)
- CentOS下如何避免文件覆蓋
- CentOS7和CentOS6系統(tǒng)有什么不同呢
- Centos 6.6默認(rèn)iptable規(guī)則詳解