Sybase資料庫死結對策

來源:互聯網
上載者:User

死結的發生對系統的效能和輸送量都有重要影響,經檢測發現,管理資訊系統的死結主要是因為兩個或多個線程(登入)搶佔同一表資料資源。引起長時間搶佔同一資源不是因為我們需要處理的事務太複雜,時間太長,而往往是因為我們在前端應用程式對資料庫作操作時忘了提交。本文介紹一種處理解決這種死結的方法。 Sybase封鎖原理

資料共用與資料一致性是一對不可調和的矛盾,為了達到資料共用與資料一致,必須進行並發控制。並發控制的任務就是為了避免共用衝突而引起的資料不一致。Sybase SQL Server並發控制的方法是加鎖機制(LOCKING).

鎖的類型

可申請的鎖

已有的鎖 S U X S ∨ ∨ × U ∨ × × X × × × 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和相應的操作員資訊表。得到操作員及其在死結時所操作的庫表,便大約可以知道應用程式的出錯處,再詢問操作員在死結時執行什麼操作以進一步認證。最後尋找程式並修正之。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.