程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SyBase數據庫 >> SyBase綜合文章 >> sybase數據庫死鎖DEADLOCK的處理

sybase數據庫死鎖DEADLOCK的處理

編輯:SyBase綜合文章
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表示該用戶的事務因死鎖而終止並被回滾。應用程序必須重新開始這個事務處理。了解到鎖的原理後,按照搜索提供的SP_LOCK,SP_WHO等系統過程准備查找造成鎖定的原因,但一直為成功,這個問題困惑了我很久,最後通過查閱IQ相關幫助文檔,得知應采用如下方式(目標數據庫為Sybase IQ12,7)   要解除IQ鎖定,可以用sp_iqlocks查看當前庫中有那些鎖定,並找到想要解鎖的那個被鎖定的鏈接的connection ID,然後用drop connection +鏈接號去殺死鏈接
此外還可以用sp_iqwho可以查看誰在使用IQ
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved