《sybase資料庫在unix、windows上的實施和管理》討論49 sybase資料庫死鎖對策
死鎖的發生對系統的效能和吞吐量都有重要影響,經檢測發現,管理資訊系統的死鎖主要是因為兩個或多個執行緒(登入)搶占同一表資料資源。引起長時間搶占同一資源不是因為我們需要處理的事務太複雜,時間太長,而往往是因為我們在前端應用程式對資料庫作操作時忘了提交.本文介紹一種處理解決這種死鎖的方法。
sybase封鎖原理
資料共享與資料一致性是一對不可調和的矛盾,為了達到資料共享與資料一致,必須進行併發控制。併發控制的任務就是為了避免共享衝突而引起的資料不一致。sybase sql server併發控制的方法是加鎖機制(locking).
鎖的型別
可申請的鎖
已有的鎖su
xsux
sybase sql server有三種封鎖型別:排它鎖(exclusive lock,簡稱x鎖);共享鎖(share lock,簡稱s鎖);更新鎖(update lock,簡稱u鎖)。這三種鎖的相容矩陣表如下:
×:表示不相容。∨:表示相容。 sybase sql server是自動決定加鎖型別的。一般來說,讀(select)操作使用s鎖,寫(update,insert和delete)操作使用x鎖。u鎖是建立在頁級上的,它在乙個更新操作開始時獲得,當要修改這些頁時,u鎖會公升級為x鎖。
鎖的力度
sql server有兩級鎖:頁鎖和表鎖。通常頁鎖比表鎖的限制更少(或更小)。頁鎖對本頁的所有行進行鎖定,而表鎖則鎖定整個表。為了減小使用者間的資料爭用和改進併發性,sql server試圖盡可能地使用頁鎖。
當sql server決定乙個語句將訪問整個表或表的大多數頁時,它用表鎖來提供更有效的鎖定。鎖定策略直接受查詢方案約束,如果update或delete語句沒有可用的索引,它就執行表掃瞄或請求乙個表鎖定。如果update或delete語句使用了索引,它就通過請求頁鎖來開始,如果影響到大多數行,它就要請求表鎖。一旦乙個語句積累的頁鎖超過鎖提公升閾值,sql server就設法給該物件分配乙個表鎖。如果成功了,頁鎖就不再必要了,因此被釋放。表鎖也在頁層提供避免鎖衝突的方法。對於有些命令sql server自動使用表鎖。
鎖的狀態
sql server加鎖有三種狀態:
1)意向鎖(intend)—是一種表級鎖,它表示在乙個資料頁上獲得乙個s或x鎖的意向。意向鎖可以防止其他事務在該資料頁的表上獲得排它鎖。
2)阻塞(blocking,簡記blk)—它表明目前加鎖程序的狀態,帶有blk字尾的鎖說明該程序目前正阻塞另乙個需要獲得鎖的程序,只有這一程序完成,其他程序才可以進行。
3)需求鎖(demand)—表示此時該程序企圖得到乙個排它鎖。它可以防止在這一表或頁上加過多的s鎖,她表示某一事務是下乙個去鎖定該錶和該頁的事務。
需求鎖是乙個內部過程,因此用sp_lock是無法看見的。
死鎖deadlock
簡單地說,有兩個使用者程序,每個程序都在乙個單獨的頁或表上有乙個鎖,而且每個程序都想在對方程序的頁或表上請求不相容鎖時就會發生「死鎖」。在這種情況下,第乙個程序在等待另一程序釋放鎖,但另一程序要等到第乙個程序的物件釋放時才會釋放自己的鎖。
sql server檢查是否死鎖,並終止事務中cpu時間積累最小的使用者(即最後進入的使用者)。sql server回滾該使用者的事務,並用訊息號1205通知有此死鎖行為的應用程式,然後允許其他使用者程序繼續進行。
在多使用者情形下,每個使用者的應用程式都應檢查每個修改資料的事務是否有1205號訊息,以此確定是否有可能死鎖。訊息號1025表示該使用者的事務因死鎖而終止並被回滾。應用程式必須重新開始這個事務處理。
查詢死鎖原因
既然管理資訊系統長時間死鎖的原因是由於我們提交或者是提交不當,那麼我們就可以通過修改程式防止出現死鎖。定位死鎖出錯處主要經過以下三步:
1)在死鎖出現時,用sp_who,sp_lock獲得程序與鎖的活動情況。
2)結合庫表sysobjects和相應的操作員資訊表查出被鎖的庫表與鎖住別人的操作員。
3)根據鎖定的庫表與操作員的崗位,可以估計出程式大約出錯處。詢問操作員在死鎖時執行的具體操作即可完全定位出錯處。最後查詢程式並修改之。
用sp_who獲取關於被阻礙程序的資訊
系統過程sp_who給出系統程序的報告。如果使用者的命令正被另一程序保持的鎖阻礙,則:
◆status列顯示「lock sleep」。
◆blk列顯示保持該鎖或這些鎖的程序標識,即被誰鎖定了。
◆loginame列顯示登入操作員。結合相應的操作員資訊表,便可知道操作員是誰。
fid spid status loginame origname blk dbname cmd
0 1 lock sleep lm lm 18 qjyd select
0 2 sleeping null null 0 master network handler
0 3 sleeping null null 0 master network handler
……用sp_lock瀏覽鎖
要得到關於當前sql server上保持的鎖的報告,可用系統過程sp_lock [spid1[,spid2]],spid1,spid2是表master.dbo.sysprocesses中的sql server程序id號,用sp_who可以得到鎖定與被鎖定的spid號:
◆locktype列顯示加鎖的型別和封鎖的粒度,有些鎖的字尾還帶有blk表明鎖的狀態。字首表明鎖的型別:sh—共享鎖,ex—排它鎖或更新鎖,中間表明鎖死在表上(」table」或』intent』)還是在頁上(page). 字尾「blk」表明該程序正在障礙另乙個需要請求鎖的程序。一旦正在障礙的程序一結束,其他程序就向前移動。「demand」字尾表明當前共享鎖一釋放, 該程序就申請互斥鎖。
◆table_id列顯示表的id號,結合sysobjects即可查出被封鎖的表名。
執行該程序後螢幕顯示
fid spid locktype table_id page row dbname class context
0 1 sh_intent 678293476 0 0 qjyd non cursor lockfam dur
0 1 sh_page 678293476 31764 0 qjyd non cursor lock
0 18 ex_intent 9767092 0 0 qjyd non cursor lockfam dur
……定位出錯處
根據sp_who與sp_lock命令的結果,結合sysobjects和相應的操作員資訊表。得到操作員及其在死鎖時所操作的庫表,便大約可以知道應用程式的出錯處,再詢問操作員在死鎖時執行什麼操作以進一步認證。最後查詢程式並修正之。
希望有所幫助,文平。
oracle 資料庫請參見
我的另一本技術專著:
Sybase資料庫死鎖及對策
死鎖的發生對系統的效能和吞吐量都有重要影響,經檢測發現,管理資訊系統的死鎖主要是因為兩個或多個執行緒 登入 搶占同一表資料資源。引起長時間搶占同一資源不是因為我們需要處理的事務太複雜,時間太長,而往往是因為我們在前端應用程式對資料庫作操作時忘了提交。本文介紹一種處理解決這種死鎖的方法。sybase封...
Sybase 資料庫死鎖問題
死鎖的發生對系統的效能和吞吐量都有重要影響,經檢測發現,管理資訊系統的死鎖主要是因為兩個或多個執行緒 登入 搶占同一表資料資源。引起長時間搶占同一資源不是因為我們需要處理的事務太複雜,時間太長,而往往是因為我們在前端應用程式對資料庫作操作時忘了提交。本文介紹一種處理解決這種死鎖的方法。sybase封...
SYBASE資料庫總結
sybase中插入資料的方式有 1.insert into b header temp cust record id select min id from c record temp group by out order no 2.select rowid identity 18 t.into b ...