欧美日韩精品在线,国内精品久久久久久久久,一级毛片恃级毛片直播,清纯唯美亚洲综合欧美色

怎樣減少SQL Server死鎖發(fā)生的情況_Mssql數(shù)據(jù)庫(kù)教程

編輯Tag賺U幣
教程Tag:暫無(wú)Tag,歡迎添加,賺取U幣!

推薦:解析SQL Server數(shù)據(jù)庫(kù)觸發(fā)器的安全隱患
觸發(fā)器權(quán)限和所有權(quán) CREATE TRIGGER 權(quán)限默認(rèn)授予定義觸發(fā)器的表所有者、sysadmin 固定服務(wù)器角色成員以及 db_owner 和 db_ddladmin 固定數(shù)據(jù)庫(kù)角色成員,并且不可轉(zhuǎn)讓。 需要的環(huán)境 本文需要的環(huán)境是已經(jīng)獲取了sql服務(wù)器的以上其中一個(gè)權(quán)限,目的是為了留下

死鎖是指在某組資源中,兩個(gè)或兩個(gè)以上的線程在執(zhí)行過(guò)程中,在爭(zhēng)奪某一資源時(shí)而造成互相等待的現(xiàn)象,若無(wú)外力的作用下,它們都將無(wú)法推進(jìn)下去,死時(shí)就可能會(huì)產(chǎn)生死鎖,這些永遠(yuǎn)在互相等待的進(jìn)程稱為死鎖線程。簡(jiǎn)單的說(shuō),進(jìn)程A等待進(jìn)程B釋放他的資源,B又等待A釋放他的資源,這樣互相等待就形成死鎖。

如在數(shù)據(jù)庫(kù)中,如果需要對(duì)一條數(shù)據(jù)進(jìn)行修改,首先數(shù)據(jù)庫(kù)管理系統(tǒng)會(huì)在上面加鎖,以保證在同一時(shí)間只有一個(gè)事務(wù)能進(jìn)行修改操作。如事務(wù)1的線程 T1具有表A上的排它鎖,事務(wù)2的線程T2 具有表B上的排它鎖,并且之后需要表A上的鎖。事務(wù)2無(wú)法獲得這一鎖,因?yàn)槭聞?wù)1已擁有它。事務(wù)2被阻塞,等待事務(wù)1。然后,事務(wù)1需要表B的鎖,但無(wú)法獲得鎖,因?yàn)槭聞?wù)2將它鎖定了。事務(wù)在提交或回滾之前不能釋放持有的鎖。因?yàn)槭聞?wù)需要對(duì)方控制的鎖才能繼續(xù)操作,所以它們不能提交或回滾,這樣數(shù)據(jù)庫(kù)就會(huì)發(fā)生死鎖了。

如在編寫(xiě)存儲(chǔ)過(guò)程的時(shí)候,由于有些存儲(chǔ)過(guò)程事務(wù)性的操作比較頻繁,如果先鎖住表A,再鎖住表B,那么在所有的存儲(chǔ)過(guò)程中都要按照這個(gè)順序來(lái)鎖定它們。如果無(wú)意中某個(gè)存儲(chǔ)過(guò)程中先鎖定表B,再鎖定表A,這可能就會(huì)導(dǎo)致一個(gè)死鎖。而且死鎖一般是不太容易被發(fā)現(xiàn)的。

如果服務(wù)器上經(jīng)常出現(xiàn)這種死鎖情況,就會(huì)降低服務(wù)器的性能,所以應(yīng)用程序在使用的時(shí)候,我們就需要對(duì)其進(jìn)行跟蹤,使用sp_who和sp_who2來(lái)確定可能是哪些用戶阻塞了其他用戶,我們還可以用下面的存儲(chǔ)過(guò)程來(lái)跟蹤具體的死鎖執(zhí)行的影響:

create procedure sp_who_lockasbegindeclare @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 @@ERRORinsert into #tmp_lock_who(spid,bl) select 0 ,blockedfrom (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>0IF @@ERROR<>0 RETURN @@ERROR -- 找到臨時(shí)表的記錄數(shù)select @intCountProperties = Count(*),@intCounter = 1from #tmp_lock_whoIF @@ERROR<>0 RETURN @@ERROR if @intCountProperties=0select '現(xiàn)在沒(méi)有阻塞和死鎖信息' as message-- 循環(huán)開(kāi)始while @intCounter <= @intCountPropertiesbegin-- 取第一條記錄select @spid = spid,@bl = blfrom #tmp_lock_who where id = @intCounter beginif @spid =0 select '引起數(shù)據(jù)庫(kù)死鎖的是: ' CAST(@bl AS VARCHAR(10)) '進(jìn)程號(hào),其執(zhí)行的SQL語(yǔ)法如下'elseselect '進(jìn)程號(hào)SPID:' CAST(@spid AS VARCHAR(10)) '被' '進(jìn)程號(hào)SPID:' CAST(@bl AS VARCHAR(10)) '阻塞,其當(dāng)前進(jìn)程執(zhí)行的SQL語(yǔ)法如下'DBCC INPUTBUFFER (@bl )end -- 循環(huán)指針下移set @intCounter = @intCounter 1enddrop table #tmp_lock_whoreturn 0

我們只需要通過(guò)在查詢分析器里面執(zhí)行sp_who_lock,就可以具體捕捉到執(zhí)行的堵塞進(jìn)程,這時(shí)我們就可以對(duì)對(duì)應(yīng)的SQL語(yǔ)句或者存儲(chǔ)過(guò)程進(jìn)行性能上面的改進(jìn)及設(shè)計(jì)。

所以我們?cè)跀?shù)據(jù)庫(kù)設(shè)計(jì)的時(shí)候,雖然不能完全避免死鎖,但可以使死鎖的數(shù)量盡量減少。增加事務(wù)的吞吐量并減少系統(tǒng)開(kāi)銷,因?yàn)橹挥泻苌俚氖聞?wù),所以就得遵循下面的原則:

按同一順序訪問(wèn)對(duì)象

如果所有并發(fā)事務(wù)按同一順序訪問(wèn)對(duì)象,則發(fā)生死鎖的可能性會(huì)降低。在寫(xiě)SQL語(yǔ)句或存儲(chǔ)過(guò)程的時(shí)候,就需要按照順序在兩個(gè)并發(fā)事務(wù)中先獲得表A上的鎖,然后獲得表B上的鎖,當(dāng)?shù)谝粋(gè)事務(wù)完成之前,另一個(gè)事務(wù)被阻塞在表A上。第一個(gè)事務(wù)提交或回滾后,第二個(gè)事務(wù)繼續(xù)進(jìn)行,而不能在語(yǔ)句里面寫(xiě)先獲得表B上的鎖,然后再獲得表A的鎖。

避免事務(wù)中的用戶交互

避免編寫(xiě)包含用戶交互的事務(wù),因?yàn)檫\(yùn)行沒(méi)有用戶交互的批處理的速度要遠(yuǎn)遠(yuǎn)快于用戶手動(dòng)響應(yīng)查詢的速度,例如答復(fù)應(yīng)用程序請(qǐng)求參數(shù)的提示。例如,如果事務(wù)正在等待用戶輸入,而用戶就去做別的事了,則用戶將此事務(wù)掛起使之不能完成。這樣將降低系統(tǒng)的吞吐量,因?yàn)槭聞?wù)持有的任何鎖只有在事務(wù)提交或回滾時(shí)才會(huì)釋放。即使不出現(xiàn)死鎖的情況,訪問(wèn)同一資源的其它事務(wù)也會(huì)被阻塞,等待該事務(wù)完成。

保持事務(wù)簡(jiǎn)短并在一個(gè)批處理中

在同一數(shù)據(jù)庫(kù)中并發(fā)執(zhí)行多個(gè)需要長(zhǎng)時(shí)間運(yùn)行的事務(wù)時(shí)通常發(fā)生死鎖。事務(wù)運(yùn)行時(shí)間越長(zhǎng),其持有排它鎖或更新鎖的時(shí)間也就越長(zhǎng),從而堵塞了其它活動(dòng)并可能導(dǎo)致死鎖。保持事務(wù)在一個(gè)批處理中,可以最小化事務(wù)的網(wǎng)絡(luò)通信往返量,減少完成事務(wù)可能的延遲并釋放鎖。

使用低隔離級(jí)別

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

使用綁定連接

使用綁定連接使同一應(yīng)用程序所打開(kāi)的兩個(gè)或多個(gè)連接可以相互合作。次級(jí)連接所獲得的任何鎖可以象由主連接獲得的鎖那樣持有,反之亦然,因此不會(huì)相互阻塞。

下面有一些對(duì)死鎖發(fā)生的一些建議:

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

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

3)設(shè)法讓UPDATE和DELETE語(yǔ)句使用索引;

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

5)對(duì)一些數(shù)據(jù)不需要及時(shí)讀取更新值的表在寫(xiě)SQL的時(shí)候在表后臺(tái)加上(nolock),如:Select * from tableA(nolock)

分享:怎樣用SQL Server事件探查器創(chuàng)建跟蹤
QL Server事件探查器(Profiler)可以幫助數(shù)據(jù)庫(kù)管理員跟蹤SQL Server數(shù)據(jù)庫(kù)所執(zhí)行的特定事件,監(jiān)視數(shù)據(jù)庫(kù)的行為;并將這些有價(jià)值的信息保存到文件或表,以便以后用來(lái)分析解決數(shù)據(jù)庫(kù)出現(xiàn)的問(wèn)題,對(duì)數(shù)據(jù)庫(kù)引擎性能進(jìn)行優(yōu)化。本文為大家一步一步講述如何用SQL Ser

來(lái)源:模板無(wú)憂//所屬分類:Mssql數(shù)據(jù)庫(kù)教程/更新時(shí)間:2009-07-14
相關(guān)Mssql數(shù)據(jù)庫(kù)教程