Oracle併發處理技術

一 併發處理
      數據庫的特色就是數據的集中管理和共享。在一般狀況下老是有若干個事務併發地運行,這些並行的事務可能併發地存取相同的數據。所以,數據庫管理系統的一個重要任務就是要有一種機制去保證這種併發的存取和修改不破壞數據的完整性,確保這些事務能正確地運行並取得正確的結果。咱們知道,事務併發執行時若不加控制的話將致使不正確的結果和數據庫的不一致狀態。爲保證數據庫數據正確地反映全部事務的更新以及在一事務修改數據時其它事務不一樣時修改這個數據,數據庫系統用鎖來控制對數據的併發存取。
二 ORACLE的併發處理機制
   無需任何說明,ORACLE自動提供行級鎖,它容許用戶在沒有衝突的狀況下更新表中不一樣的行。行級鎖對聯機事務處理很是有用。
1 ORACLE鎖的類型
在正常狀況下,ORACLE會自動鎖住須要加鎖的資源以保護數據,這種鎖是隱含的,叫隱含鎖。然而,在一些條件下,這些自動的鎖在實際應用時並不能知足須要,必須人工加一些鎖。這些人工加的鎖叫顯示鎖。
下面指明瞭會產生隱含鎖的SQL語句:
INSERT;
UPDATE;
DELETE;
DDL/DCL語句。
下面指明瞭會產生顯示鎖的SQL語句:
SELECT FOR UPDATE;
LOCK TABLE IN XXX 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 TRANSACTION READ ONLY
SQL 語句
COMMIT,ROLLBACK,DDL結束只讀事務
3 事務一致性的級別
事務是定義和維護一致性的單位,封鎖就是要保證這種一致性。若是對封鎖的要求高會增長開銷,下降併發性和效率;有的事務並不嚴格要求結果的質量(如用於統計的事務),若是加上嚴格的封鎖則是沒必要要和不經濟的。所以有必要進行進一步的分析,考察不一樣級別的一致性對數據庫數據的質量及並行能力的影響。數據庫

一致性級別定義爲以下的幾個條件:
(1) 事務不修改其它任何事務的髒數據。髒數據是被其它事務修改過,但還沒有提交的數據。
(2) 在事務結束前不對被修改的資源解鎖。
(3) 事務不讀其它任何事務的髒數據。
(4) 在讀前對數據加共享鎖(RS)和行排它鎖,直至事務結束。編程

  • 知足條件1的事務叫第0級事務。
  • 知足條件1和2的事務叫第1級一致性事務。
  • 知足條件一、2和3的事務爲2級一致性事務。ORACLE的讀一致性保

證了事務不讀其它事務的髒數據。併發

  • 知足條件一、二、3和4的事務叫第3級一致性事務。

由ORACLE的三個性質:自動加隱式鎖、在事務結束時釋放鎖和讀一致性,使ORACLE成爲自動知足以上的0、1和2級一致性事務。所以,ORACLE自動防止了髒讀(寫-讀依賴)。可是,ORACLE不能自動防止丟失修改(寫-寫依賴),讀的不可重複性(讀-寫依賴),完全解決併發性中的問題還需知足第4個條件(3級一致性事務),這須要程序員根據實際狀況編程。
方法以下:事務

  • 若是想在一段時間內使一些數據不被其它事務改變,且在本事務內僅僅查詢數據,則可用SET TRANSACTION READ ONLY 語句達到這一目的。
  • 若是想在一事務內修改一數據,且避免丟失修改,則應在讀這一數據前用SELECT FOR UPDATE對該數據加鎖。
  • 若是想在一事務內讀一數據,且想基於這一數據對其它數據修改,則應在讀數據前對此數據用SELECT FOR UPDATE加鎖。對此種類型的應用,用這條SQL語句加鎖最恰當。
  • 若是想避免不可重複讀現象,可在讀前用SELECT FOR UPDATE對數據加鎖,或用SET TRANSACTION READ ONLY設置只讀事務。
相關文章
相關標籤/搜索