成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

減少SQL Server死鎖的方法

數據庫 SQL Server
所謂死鎖就是指兩個或兩個以上的進程在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。那么對于SQL Server數據庫來說給如何減少出現死鎖問題呢?

如在數據庫中,如果需要對一條數據進行修改,首先數據庫管理系統會在上面加鎖,以保證在同一時間只有一個事務能進行修改操作。如事務1的線程 T1具有表A上的排它鎖,事務2的線程T2 具有表B上的排它鎖,并且之后需要表A上的鎖。事務2無法獲得這一鎖,因為事務1已擁有它。事務2被阻塞,等待事務1。然后,事務1需要表B的鎖,但無法獲得鎖,因為事務2將它鎖定了。事務在提交或回滾之前不能釋放持有的鎖。因為事務需要對方控制的鎖才能繼續操作,所以它們不能提交或回滾,這樣數據庫就會發生死鎖了。

如在編寫存儲過程的時候,由于有些存儲過程事務性的操作比較頻繁,如果先鎖住表A,再鎖住表B,那么在所有的存儲過程中都要按照這個順序來鎖定它們。如果無意中某個存儲過程中先鎖定表B,再鎖定表A,這可能就會導致一個死鎖。而且死鎖一般是不太容易被發現的。

如果服務器上經常出現這種死鎖情況,就會降低服務器的性能,所以應用程序在使用的時候,我們就需要對其進行跟蹤,使用sp_who和sp_who2來確定可能是哪些用戶阻塞了其他用戶,我們還可以用下面的存儲過程來跟蹤具體的死鎖執行的影響:

create procedure sp_who_lock

as

begin

declare @spid int,@bl int,

@intTransactionCountOnEntry int,

@intRowcount int,

@intCountProperties int,

@intCounter int

create table #tmp_lock_who (id int identity(1,1),spid smallint,bl smallint)

IF @@ERROR<>0 RETURN @@ERROR

insert into #tmp_lock_who(spid,bl) select 0 ,blocked

from (select * from sysprocesses where blocked>0 ) a

where not exists(select * from (select * from sysprocesses where blocked>0 ) b
where a.blocked=spid)

union select spid,blocked from sysprocesses where blocked>0

IF @@ERROR<>0 RETURN @@ERROR

-- 找到臨時表的記錄數

select @intCountProperties = Count(*),@intCounter = 1

from #tmp_lock_who

IF @@ERROR<>0 RETURN @@ERROR

if @intCountProperties=0

select ’現在沒有阻塞和死鎖信息’ as message

-- 循環開始

while @intCounter <= @intCountProperties

begin

-- 取***條記錄

select @spid = spid,@bl = bl

from #tmp_lock_who where id = @intCounter
begin

if @spid =0

select ’引起數據庫死鎖的是: ’+ CAST(@bl AS VARCHAR(10)) + ’進程號,其執行的SQL語法如下’

else

select ’進程號SPID:’+ CAST(@spid AS VARCHAR(10))+ ’被’ + ’進程號SPID:’+ CAST(@bl AS VARCHAR(10)) +’阻塞,其當前進程執行的SQL語法如下’

DBCC INPUTBUFFER (@bl )

end

-- 循環指針下移

set @intCounter = @intCounter + 1

end

drop table #tmp_lock_who

return 0

end

我們只需要通過在查詢分析器里面執行sp_who_lock,就可以具體捕捉到執行的堵塞進程,這時我們就可以對對應的SQL語句或者存儲過程進行性能上面的改進及設計。 [Page]

所以我們在數據庫設計的時候,雖然不能完全避免死鎖,但可以使死鎖的數量盡量減少。增加事務的吞吐量并減少系統開銷,因為只有很少的事務,所以就得遵循下面的原則:

按同一順序訪問對象

如果所有并發事務按同一順序訪問對象,則發生死鎖的可能性會降低。在寫SQL語句或存儲過程的時候,就需要按照順序在兩個并發事務中先獲得表A上的鎖,然后獲得表B上的鎖,當***個事務完成之前,另一個事務被阻塞在表A上。***個事務提交或回滾后,第二個事務繼續進行,而不能在語句里面寫先獲得表B上的鎖,然后再獲得表A的鎖。

避免事務中的用戶交互

避免編寫包含用戶交互的事務,因為運行沒有用戶交互的批處理的速度要遠遠快于用戶手動響應查詢的速度,例如答復應用程序請求參數的提示。例如,如果事務正在等待用戶輸入,而用戶就去做別的事了,則用戶將此事務掛起使之不能完成。這樣將降低系統的吞吐量,因為事務持有的任何鎖只有在事務提交或回滾時才會釋放。即使不出現死鎖的情況,訪問同一資源的其它事務也會被阻塞,等待該事務完成。

保持事務簡短并在一個批處理中

在同一數據庫中并發執行多個需要長時間運行的事務時通常發生死鎖。事務運行時間越長,其持有排它鎖或更新鎖的時間也就越長,從而堵塞了其它活動并可能導致死鎖。保持事務在一個批處理中,可以最小化事務的網絡通信往返量,減少完成事務可能的延遲并釋放鎖。

使用低隔離級別

確定事務是否能在更低的隔離級別上運行。執行提交讀允許事務讀取另一個事務已讀取(未修改)的數據,而不必等待***個事務完成。使用較低的隔離級別(例如提交讀)而不使用較高的隔離級別(例如可串行讀)可以縮短持有共享鎖的時間,從而降低了鎖定爭奪。

使用綁定連接

使用綁定連接使同一應用程序所打開的兩個或多個連接可以相互合作。次級連接所獲得的任何鎖可以象由主連接獲得的鎖那樣持有,反之亦然,因此不會相互阻塞。

下面有一些對死鎖發生的一些建議:

1)對于頻繁使用的表使用集簇化的索引;

2)設法避免一次性影響大量記錄的T-SQL語句,特別是INSERT和UPDATE語句;

3)設法讓UPDATE和DELETE語句使用索引;

4)使用嵌套事務時,避免提交和回退沖突;

5)對一些數據不需要及時讀取更新值的表在寫SQL的時候在表后臺加上(nolock),如:Select * from tableA(nolock) 。

【編輯推薦】

  1. SQL Server死鎖測試
  2. 深度探究SQL Server死鎖的原因
  3. SQL Server死鎖問題的解決與分析
責任編輯:迎迎 來源: voboy.blog.ccidnet.com
相關推薦

2009-03-30 10:56:58

SQL Server數據庫死鎖數據庫

2010-11-09 16:37:25

Sql server死

2011-03-08 09:27:34

SQL Server數死鎖

2010-11-09 17:02:43

SQL Server死

2010-09-14 15:34:29

sql server死

2010-07-07 13:58:25

SQL Server死

2010-11-09 17:04:20

SQL Server死

2010-07-06 10:08:57

SQL Server

2014-03-17 10:34:48

SQL Server

2010-11-09 16:29:39

SQL Server死

2010-11-09 16:20:46

SQL Server死

2023-08-15 08:26:34

SQL Server查找死鎖

2010-06-30 14:15:08

SQL Server死

2010-07-02 10:53:32

SQL Server死

2010-07-20 10:27:57

SQL Server

2012-08-20 09:45:18

SQL Server

2010-10-19 14:11:20

SQL SERVER恢

2010-08-26 10:45:33

死鎖SQL Server

2010-11-10 15:23:55

SQL SERVER

2011-02-28 13:19:50

SQL Server SQL死鎖
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品一二三区 | 亚洲 欧美 精品 | www.久久| 欧美日韩淫片 | 香蕉久久a毛片 | 欧美日韩中 | 国产精品一区二区久久 | 国产精品国产成人国产三级 | 黄色片在线 | 午夜电影日韩 | 97视频在线观看网站 | 亚洲啊v在线 | h视频免费在线观看 | 精品欧美一区二区三区免费观看 | 538在线精品 | 国产在线观看一区二区三区 | 亚洲视频区 | 久久中文字幕电影 | 欧美久久大片 | 亚州无限乱码 | 国产高清精品一区二区三区 | 国产乱一区二区三区视频 | 国产乱码精品一区二区三区av | 在线视频一区二区三区 | 亚洲国产精品久久久久婷婷老年 | 欧美99| 国产97在线视频 | 毛片一级电影 | 性色av一区 | 成人三级视频 | 亚洲国产一区视频 | 亚洲精品免费视频 | 成人影院免费视频 | 欧美一区二区三区的 | 亚洲精品一区二区 | 九九看片 | 国产精品久久亚洲7777 | 国产欧美精品一区 | av中文网 | 国产资源一区二区三区 | 伊人影院在线观看 |