Sybase IQ資料庫表鎖定後解鎖軼事

2021-05-01 20:58:12 字數 1986 閱讀 6068

昨天在操作sybase iq12.7時意外操作造成了資料庫表鎖定,不能刪除被鎖定表資料也不能往其中寫入資料。由於著急往該錶抽入資料,因此立馬著手解決該錶的解鎖問題。

無奈此前沒有接觸過sybase iq12.7這套資料庫產品,加之當時已屬於下班時間無法求助於支援人員支援,因此只有借助搜尋引擎強大的搜尋能力,通過搜尋結果了解到死鎖的原理如下:

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如何鎖乙個表的某一行 settransaction isolation level read uncommitted select from table rowlock where id 1 2鎖定資料庫的乙個表 select from table with holdlock 加鎖語句 sybas...

MySQL鎖定資料庫表

mysql中所有鎖定不會是死鎖的。這通過總是在乙個查詢前立即請求所有必要的鎖定並且總是以同樣的順序鎖定表來管理。對write,mysql使用的鎖定方法原理如下 對read,mysql使用的鎖定方法原理如下 當乙個鎖定被釋放時,鎖定可被寫鎖定佇列中的執行緒得到,然後是讀鎖定佇列中的執行緒。這意味著,如...

資料庫鎖定

在很多客戶一起查詢資料表時,如果使客戶能最快地查詢到資料就是排程和鎖定做的工作了。在mysql中,我們把select操作叫做讀,把對資料表修改增加的操作 insert,update,replace.叫做寫。mysql的基本排程策略可以歸納為以下兩條 寫入請求將按它們到達伺服器的順序進行處理 寫操作的...