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