在it 專家中有一種普遍的誤解,就是認(rèn)為“鎖定是不好的東西”,你必須盡一切可能保證數(shù)據(jù)庫鎖定不會使得進(jìn)程無法正常運(yùn)行。為了能夠確保一個一致的數(shù)據(jù)庫環(huán)境,在對資源進(jìn)行修改時,數(shù)據(jù)庫引擎必須利用一種機(jī)制來獲得對資源的獨(dú)占權(quán)。
sql server中也用鎖定,它們是指為了達(dá)到這種一致性,數(shù)據(jù)庫引擎用來保證每一次只有一個線程同時訪問同一個資源的對象。如果不用鎖定的話,各個進(jìn)程同時進(jìn)行數(shù)據(jù)修改就可能發(fā)生,這就會使數(shù)據(jù)庫處于一種不一致的狀態(tài)。這樣看來,鎖定就成了好東西;但是,你應(yīng)該以特定的方式來計(jì)劃你的應(yīng)用程序,讓涉及的鎖定的數(shù)量降到最少。在這篇文章中,我將討論一個讓你能夠分析數(shù)據(jù)庫鎖定問題的存儲過程。
找出什么被鎖定了
系統(tǒng)的反應(yīng)遲緩意味著你應(yīng)該做一些調(diào)查了。你的查找最好從測定系統(tǒng)發(fā)生鎖定的數(shù)量和頻率開始。如果你的系統(tǒng)環(huán)境處理事務(wù)性很高的話,這樣各個應(yīng)用程序爭奪資源就會很常見,從而引起鎖定。解決這些問題的關(guān)鍵就在于能夠確定被鎖定的資源和爭奪資源的進(jìn)程。
sp_lock
sp_lock這個系統(tǒng)存儲過程與sql server 2000 打包在一起,它將使你對在你系統(tǒng)中發(fā)生的鎖定有深入的了解。這個程序會從主數(shù)據(jù)庫中的syslockinfo中返回與鎖定相關(guān)的大量信息,而主數(shù)據(jù)庫是一個包括了所有允許、轉(zhuǎn)換和等待鎖定請求信息的系統(tǒng)工作臺。
讓我們來看一下運(yùn)行 sp_lock 程序之后,它會為我們提供什么信息:
execute sp_lock
在我的系統(tǒng)中,這是該存儲過程返回的內(nèi)容。sp_lock 返回的信息并不是一目了然的,要獲得有用的數(shù)據(jù),還需要做一些查找。但是,你也可以復(fù)制該存儲過程的文本,然后創(chuàng)建一個新的,從而得到關(guān)于系統(tǒng)進(jìn)程的更好的解釋。(在這篇文章中,我們將集中討論sp_lock返回的數(shù)據(jù)。)
從上面的結(jié)果我們可以看到spid、dbid、objid、indid、type、resource、mode和status字段。spid是進(jìn)程標(biāo)識號碼,用于識別到sql 服務(wù)器的連接。要發(fā)現(xiàn)哪些用戶和該spid相連,你就要執(zhí)行存儲過程sp_who,并將spid作為一個參數(shù)傳輸給該程序。dbid是鎖定發(fā)生的數(shù)據(jù)庫,你可以在主數(shù)據(jù)庫中的sysdatabases表格中找到它。字段objid用來顯示在數(shù)據(jù)庫中鎖定發(fā)生所在的對象。要查看這個對象,你可以在主數(shù)據(jù)庫中的sysobjects表格中查詢指定的objid。
在以上的屏幕截圖中產(chǎn)生的單一記錄并不一定能顯示正在你的工作環(huán)境中發(fā)生的真實(shí)情況。在運(yùn)行這個程序時,你想要找到500到1000個甚至更多結(jié)果。每一次你執(zhí)行sp_lock,都將有可能得到不同的結(jié)果,因?yàn)橛职l(fā)生了新的鎖定,而部分舊的鎖定已經(jīng)被解除了。如果你發(fā)現(xiàn)sp_lock返回的結(jié)果中,大量的結(jié)果都有著相同的spid,很有可能該進(jìn)程正在進(jìn)行大型的處理,同時這些鎖定可能開始阻止新事務(wù)的發(fā)生。
當(dāng)你發(fā)現(xiàn)一個spid 獲得了大量的數(shù)據(jù)庫鎖定時,這將有助于確定什么存儲過程或語句正在運(yùn)行。為了達(dá)到這個目的,運(yùn)行以下 dbcc 命令:
dbcc inputbuffer(spid)
這個dbcc命令將返回正在eventinfo字段中運(yùn)行的語句的相關(guān)信息。
一個可靠的起點(diǎn)
系統(tǒng)運(yùn)行緩慢可能說明你的表格上有大量的鎖定。造成這些鎖定的原因較多,如某個用戶正在你的系統(tǒng)中運(yùn)行一個相當(dāng)長的查詢,一個進(jìn)程占用大量資源或者兩個關(guān)鍵進(jìn)程爭奪同一資源,經(jīng)常造成死鎖。
一旦發(fā)現(xiàn)你認(rèn)為正在減緩你系統(tǒng)速度的進(jìn)程,應(yīng)該怎么辦?在大多數(shù)情況下,不能采取任何措施,只能監(jiān)控系統(tǒng)。結(jié)束這個進(jìn)程并不是明智之舉,因?yàn)樗撕芏嘞到y(tǒng)鎖定,除非你完全肯定不會有其他的負(fù)面影響。不然的話,你就應(yīng)該想辦法自動分析鎖定狀況。還有一個解決辦法就是想出一種方法,使得在一天的特定時間內(nèi),當(dāng)系統(tǒng)鎖數(shù)量達(dá)到極限時,發(fā)出通知。
你對自己的系統(tǒng)信息收集的越多,在解決問題時,你的優(yōu)勢就越大。
tim chapman是肯塔基州路易維爾市一家銀行的sql server數(shù)據(jù)庫管理員,他有超過7年的行業(yè)經(jīng)驗(yàn)。
|
新聞熱點(diǎn)
疑難解答
圖片精選