Sybase系統采用鎖機制作為其並發控制機制。配置參數NUMBER OF LOCKS,設定了整個系統可以使用的鎖數目。如果所要求的鎖數目超過此參數設置,系統就會報錯。
1. 鎖的類型
除了共享鎖、排它鎖、意圖鎖、更新鎖之外,SYBASE系統引入了需求鎖(demand lock)。在第6.3.3一節中,我們講到:由於不斷有新的事務給數據加共享鎖,一個事務可能長時間無法獲取排它鎖,Sybase系統使用需求鎖來解決這個問題。
一 個事務申請數據的排它鎖,它要等待數據上現有的共享鎖被釋放。這時其它新的事務可以繼續訪問該數據,給數據加共享鎖。在連續有三個新的事務獲取了數據的共 享鎖之後,最初申請排它鎖的事務就給該數據加上需求鎖。在數據上存在需求鎖之後,系統就不允許新的事務訪問該數據,給數據加共享鎖,所有新的事務必須等 待。這樣,在所有的共享鎖被釋放後,最初的事務就將需求鎖轉換為排它鎖,從而可以進行事務的處理。
2. 鎖的粒度
Sybase系統鎖的粒度,可以劃分為:數據庫、表、頁、記錄。可以通過以下方式使用數據庫鎖:
(1)在整個數據庫系統啟動時,使系統進入單用戶模式。
(2)在數據庫系統正常運行過程中,更改單個數據庫的屬性,使該數據庫只可為特權用戶使用。
要使用表鎖,可以在命令行或者應用程序中,使用lock table命令。另外表鎖也可能由於鎖的升級而獲得。
對於頁鎖和記錄鎖,系統提供了三種鎖模式(lock scheme):allpages、datapages、datarows。allpages和datapages模式屬於頁鎖,而datarows屬於記錄鎖。
對allpages模式,事務申請鎖時,不但要鎖定數據所在的頁,而且數據所對應的索引頁也要被鎖定。如果事務申請的是排它鎖,這些鎖定一直到事務結束才釋放。
對datapages模 式,事務申請鎖時,只鎖定數據所在的頁,數據所對應的索引頁不需要鎖定。如果事務要更新數據,就要為數據所在的頁加排它鎖。這時,如果表的數據更新要引起 索引中數據的更新,就需要在更新執行時為索引頁加排它鎖,在更新完成後,就立即釋放索引頁上的排它鎖。而數據頁上的排它鎖,一直到事務結束才釋放。
對datarows 模式,其處理方式等同於datapages模式,區別在於datarows模式使用的是記錄鎖。
在創建表時,可以指定表所使用的鎖模式。如果沒有指定,就使用配置參數LOCK SCHEME的設定。缺省情況下,系統使用allpages鎖模式,該模式雖說降低了系統的並發處理能力,但減少了鎖管理的系統開銷。
一旦被創建,表的鎖模式就確定下來。使用allpages或者datapages模式的表,只能使用頁鎖和表鎖;使用datarows模式的表,只能使用記錄鎖和表鎖。可以使用命令改變一個表的鎖模式。
3. 鎖的轉換
鎖轉換在Sybase系統中出現的頻率比較高,除了需求鎖的使用之外,還與系統使用了不同的排它鎖申請機制有關。在SQL語句需要數據的排它鎖時,系統在SQL語句處理的初始階段,為它分配一個更新鎖,即使這時該數據上不存在任何鎖。在SQL語句開始執行時,才將更新鎖轉換為排它鎖。因此,在SQL語句最後執行之前,其他的SQL語句仍舊可以訪問該數據,從而提高了數據的利用率,提高了事務的並發處理能力。但這種方法同時也增加了鎖機制的復雜程度,使系統容易出現鎖的問題。
4. 鎖的升級
在Sybase系統中,只存在兩種情況下的鎖升級:對使用datarows模式的表,可以由記錄鎖升級為表鎖;對使用allpages或者datapages模式的表,可以由頁鎖升級為表鎖。在整個系統范圍內,對鎖的升級可以使用下列配置參數進行設定:
PAGE LOCK PROMOTION HWM:設定頁鎖升級的高水平值。一個事務在一個表上獲得的頁鎖,達到該參數的設置後,系統就試圖升級為表鎖。
PAGE LOCK PROMOTION LWM:設定頁鎖升級的低水平值。一個事務在一個表上獲得的頁鎖,低於該參數的設置,系統不會進行鎖的升級。在頁鎖的數目超過此參數設置,但沒有達到參數PAGE LOCK PROMOTION HWM的設置時,系統就根據參數PAGE LOCK PROMOTION PCT的設置,決定是否需要鎖的升級。
PAGE LOCK PROMOTION PCT:設定進行頁鎖升級的頁使用百分比。一個事務在一個表上獲得的頁鎖,超過參數PAGE LOCK PROMOTION LWM的設置,但低於參數PAGE LOCK PROMOTION HWM的設置時,系統就計算事務使用的數據頁占表中總數據頁的百分比。如果達到此參數設置,系統就試圖升級為表鎖。
ROW LOCK PROMOTION HWM:設定記錄鎖升級的高水平值。其處理方式同頁鎖。
ROW LOCK PROMOTION LWM:設定記錄鎖升級的低水平值。其處理方式同頁鎖。
ROW LOCK PROMOTION PCT:設定記錄鎖升級的使用百分比。其處理方式同頁鎖。
可以使用命令sp_setpglockpromote、sp_setrowlockpromote,在數據庫、表的級別上對鎖的升級進行設定。對單個表的鎖升級設定,具有最高的優先級。
5. 鎖的等待和超時
為了防止事務對鎖的無限期等待,Sybase系統引入了需求鎖。配置參數LOCK WAIT PERIOD,在系統范圍內指定了鎖的等待、超時時間,可以使用set lock命令在命令行或者應用程序中為單個會話設定。
6. 隔離級別
Sybase系統使用的四級隔離級別,同SQL-92標准(第6.3.8一節所述)。缺省情況下,系統使用1級的隔離級別。用戶可以通過以下方式,對隔離級別進行設置:
(1)使用set isolation level命令,在命令行或者應用程序中,設定單個會話的隔離級別。
(2)在SQL語句中,設定單個SQL語句的隔離級別。
(3)在SQL語句中,為SQL語句中要訪問的表設定隔離級別。
7. 死鎖
配置參數DEADLOCK CHECKING PERIOD,設定了系統檢查死鎖的時間間隔。