資料庫並發處理
來源:互聯網
上載者:User
一、並發處理 資料庫的特點就是資料的集中管理和共用。在通常情況下總是有若干個事務並發地運行,這些並行的事務可能並發地存取相同的資料。因此,資料庫管理系統的一個重要任務就是要有一種機制去保證這種並發的存取和修改不破壞資料的完整性,確保這些事務能正確地運行並取得正確的結果。我們知道,事務並發執行時若不加控制的話,將導致不正確的結果和資料庫的不一致狀態。為保證資料庫資料正確地反映所有事務的更新,以及在一事務修改資料時其它事務不同時修改這個資料,資料庫系統用鎖來控制對資料的並發存取。二、ORACLE的並發處理機制無需任何說明,ORACLE自動提供行級鎖,它允許使用者在沒有衝突的情況下更新表中不同的行。行級鎖對聯機交易處理非常有用。 1、ORACLE鎖 ORACLE鎖的類型在正常情況下,ORACLE會自動鎖住需要加鎖的資源以保護資料,這種鎖是隱含的,叫隱含鎖。然而,在一些條件下,這些自動的鎖在實際應用時並不能滿足需要,必須人工加一些鎖。這些人工加的鎖叫顯示鎖。下面指明了會產生隱含鎖的SQL語句: INSERT; UPDATE; DELETE; DDL/DCL語句。下面指明了會產生顯示鎖的SQL語句: SELECT FOR UPDATE; LOCK TABLE INXXX MODE。解決讀的不可重複性可以用下面的方法。在ORACLE中,用SELECT FOR UPDATE對預期要修改的記錄加行排它鎖(X),對錶加行共用鎖定(RS)。它常用於要鎖住一行,但不去真的修改這一行。鎖之間是有相互作用的。例如,更新時會對錶加RX鎖,對行加X鎖,而只有RS鎖和RX鎖允許再加RX鎖。因此,當存在RS和RX鎖時,表允許更新。再比如,當執行DDL和DCL語句時,會對錶加排它鎖X,而在存在X、RS、SRX、RX和S鎖的前提下,都不能再加X鎖。因此,當存在X,RS,SRX,RS或S鎖時,不能對錶做DCL和DDL操作。這樣,資料庫會自動防止一個使用者更新表中的資料,而其他使用者在同時修改表的結構。 2、ORACLE唯讀事務 ORACLE支援唯讀事務。唯讀事務有以下特點: *在事務中只允許查詢 *其它事務可修改和查詢資料 *在事務中,其它使用者的任何修改都看不見唯讀事務的寫法為: SET TRANS ACTION READONLY SQL語句 COMMIT,ROLLBACK,DDL結束唯讀事務 3、事務一致性的層級 事務是定義和維護一致性的單位,封鎖就是要保證這種一致性。如果對封鎖的要求高會增加開銷,降低並發性和效率;有的事務並不嚴格要求結果的品質(如用於統計的事務),如果加上嚴格的封鎖則是不必要和不經濟的。因此有必要進行進一步的分析,考察不同層級的一致性對資料庫資料的品質及並行能力的影響。一致性層級定義為如下的幾個條件: 1) 事務不修改其它任何事務的髒資料。髒資料是被其它事務修改過,但尚未提交的資料。 2) 在事務結束前不對被修改的資源解鎖。 3) 事務不讀其它任何事務的髒資料。 4) 在讀前對資料加共用鎖定(RS)和行排它鎖,直至事務結束。 *滿足條件1的事務叫第0級事務。 *滿足條件1和2的事務叫第1級一致性事務。 *滿足條件1、2和3的事務為2級一致性事務。 ORACLE的讀一致性保證了事務不讀其它事務的髒資料。 *滿足條件1、2、3和4的事務叫第3級一致性事務。由ORACLE的三個性質:自動加隱式鎖、在事務結束時釋放鎖和讀一致性,使ORACLE成為自動滿足以上的0、1和2級一致性事務。因此,ORACLE自動防止了髒讀(寫-讀依賴)。但是,ORACLE不能自動防止丟失修改(寫-寫依賴),讀的不可重複性(讀-寫依賴),徹底解決並發性中的問題還需滿足第4個條件(3級一致性事務),這需要程式員根據實際情況編程。方法如下: *如果想在一段時間內使一些資料不被其它事務改變,且在本事務內僅僅查詢資料,則可用SETTRANSACTIONREADONLY語句達到這一目的。 *如果想在一事務內修改一資料,且避免丟失修改,則應在讀這一資料前用SELECTFORUPDATE對該資料加鎖。 *如果想在一事務內讀一資料,且想基於這一資料對其它資料修改,則應在讀資料前對此資料用SELECTFORUPDATE加鎖。對此種類型的應用,用這條SQL語句加鎖最恰當。 *如果想避免不可重複讀取現象,可在讀前用SELECTFORUPDATE對資料加鎖,或用SET TRANS ACTION READONLY設定唯讀事務。三、SYBASE的並發處理機制 SYBASE的並發處理方法與ORACLE類似,但在很多方面不一樣。SYBASE有兩種粒度的封鎖,一種的粒度是頁,另一種的粒度是表。SYBASE根據SQL語句的情況決定用頁封鎖還是用表封鎖。 1、頁級鎖 頁級鎖有以下所始的三類: *SHARED:在讀操作時加共用鎖定。在預設狀態下,在讀操作完成後釋放共用鎖定。 *EXCLUSIVE:在更新操作時加排它鎖。在預設狀態下,在事務完成後釋放排它鎖。 *UPDATE:在修改和刪除操作的初期(讀到被修改或刪除的頁時)加修改鎖。在表上加了修改鎖之後,還可以再加共用鎖定,但不能再加修改和排它鎖。在進行修改和刪除操作時,如果沒有共用鎖定存在,修改鎖則轉化為排它鎖。此鎖的目的是為了防止死結。SYBASE僅當在WHERE子句中包含索引列時才會使用頁級的排它鎖和修改鎖。 2、表級鎖 表級鎖有以下所示的三類: *INTENT:當表中存在頁級的排它鎖和共用鎖定時,在表上加意圖鎖定。在所有的頁級鎖釋放後,意圖鎖定隨著釋放。 *SHARED:在讀操作時加共用鎖定。在預設狀態下,在讀操作完成後釋放共用鎖定。 *EXCLUSIVE:在更新操作時加排它鎖。在預設狀態下,在事務完成後釋放排它鎖。 3、請求鎖 請求鎖用以防止共用鎖定一個接一個無休止地加在表上,從而寫事務(要加排它鎖)無法進行。 4、SYBASE的封鎖層級 在SYBASE根據ANSI標準定義事務的封鎖層級: (1) 層級1:髒讀 (2) (2)層級2:不可重複讀取 (3) (3)游標帶來的當前值混亂 (4) SYBASE的預設一致性層級為1。如果要達到一致性層級2和3,必須使用HOLDLOCK關鍵字把共用鎖定持續到事務的結束。方法如下: SELECT*FROM AUTHS HOLDLOCK WHERE AUTHOR_CODE='A00001' SYBASE還可以通過T-SQL的SET命令改變SYBASE的一致性層級,從而使SYBASE自動在SELECT語句中加HOLDLOCK關鍵字: SET TRANS ACTION IS OLATION LEVEL3 5、在SYBASE中提高並發效率的方法 *避免在表中特定的頁上多個使用者過多的封鎖。 *避免在人機互動的應用中定義事務,這樣會使某個使用者長時間封鎖住表(如去接電話),使其他使用者持續等待。 *使事務盡量的短。 *僅當必要時才使用HOLDLOCK關鍵字。