ORACLE的鎖機制

來源:互聯網
上載者:User

資料庫使用鎖(lock)來保證任何給定時刻最多隻有一個事務在修改給定的一段資料。實質上講,正是鎖機制才使並發控製成為可能。

ORACLE的封鎖策略:  
  1、只有當修改時,Oracle在行級上鎖定資料,不要把鎖定上升到塊或表級。  
  2、Oracle決不會為讀取而鎖定資料,簡單讀取不能在資料行上設定鎖定。  
  3、資料的寫入器不會阻塞資料讀取器。  
  4、只有當另一個資料寫入器已經鎖定了某行資料後,才阻塞其他人對該行資料的寫入。資料的讀取器決不會阻塞資料的寫入器。

 

 

-------------------------------------------------------------------------
Oracle並發處理機制的簡單看法。http://www.51testing.com/html/97/n-131297.html

轉載內容如下:

在Oracle開發過程中,如果你只是獨立地測試你的應用,然後部署,並交給數十個並發使用者使用,就很有可能痛苦地遭遇原先未能檢測到的並發問題。例如,2個使用者同時修改某張訂單,首先他們會查詢這張訂單存在不存在,如果存在,那麼修改它的狀態。在並行作業中,使用者1會很奇怪的發現他的修改丟失了。當然,除此之外,在未能夠很好的處理並發問題可能遭遇的情況還有:

  ◆破壞資料的完整性。

  ◆隨著使用者數的增多,應用的運行速度減慢。

  ◆不能很好地擴縮應用來支援大量使用者。

  為解決這些問題。首先要引入的是ORACLE的鎖機制。資料庫使用鎖(lock)來保證任何給定時刻最多隻有一個事務在修改給定的一段資料。實質上講,正是鎖機制才使並發控製成為可能。對ORACLE的鎖機制可以查看ORACLE官方文檔介紹。以下是對ORACLE鎖的一點總結。

  Oracle只在修改時才對資料加行級鎖。正常情況下不會升級到塊級鎖或表級鎖(不過兩段提交期間的一段很短的時間內除外,這是一個不常見的操作)。

  ◆如果只是讀資料,Oracle絕不會對資料鎖定。不會因為簡單的讀操作在資料行上鎖定。

  ◆寫入器(writer)不會阻塞讀取器(reader)。換種說法:讀(read)不會被寫(write)阻塞。這一點幾乎與其他所有資料庫都不一樣。在其他資料庫中,讀往往會被寫阻塞。儘管聽上去這個特性似乎很不錯(一般情況下確實如此),但是,如果你沒有充分理解這個思想,而且想通過應用邏輯對應用施加完整性條件約束,就極有可能做得不對。

  ◆寫入器想寫某行資料,但另一個寫入器已經鎖定了這行資料,此時該寫入器才會被阻塞。讀取器絕對不會阻塞寫入器。

  開發人員要儘可能的考慮以上因素。而且還要意識到這些事ORACLE專屬的。針對其他資料庫,在鎖的應用上略有不同。

  以DB2為例

  1.Oracle通過具有意圖鎖定的多粒度封鎖機制進行並發控制,保證資料的一致性。其DML鎖(資料鎖)分為兩個層次(粒度):即表級和行級。通常的DML操作在表級獲得的只是意圖鎖定(RS或RX),其真正的封鎖粒度還是在行級;DB2也是通過具有意圖鎖定的多粒度封鎖機制進行並發控制,保證資料的一致性。

  其DML鎖(資料鎖)分為兩個層次(粒度):即表級和行級。通常的DML操作在表級獲得的只是意圖鎖定(IS,SIX或IX),其真正的封鎖粒度也是在行級;另外,在Oracle資料庫中,單純地讀資料(SELECT)並不加鎖,這些都提高了系統的並發程度,Oracle強調的是能夠“讀”到資料,並且能夠快速的進行資料讀取。而DB2的鎖強調的是“讀一致性”,進行讀資料(SELECT)時會根據不同的隔離等級(RR,RS,CS)而分別加S,IS,IS鎖,只有在使用UR隔離等級時才不加鎖。從而保證不同應用程式和使用者讀取的資料是一致的。

  2. 在支援高並發度的同時,DB2和Oracle對鎖的操縱機制有所不同:Oracle利用意圖鎖定及資料行上加鎖標誌位等設計技巧,減小了Oracle維護行級鎖的開銷,使其在資料庫並發控制方面有著一定的優勢。而DB2中對每個鎖會在鎖的記憶體(locklist)中申請分配一定位元組的記憶體空間,具體是X鎖64位元組記憶體,S鎖32位元組記憶體(註:DB2 V8之前是X鎖72位元組記憶體而S鎖36位元組記憶體)。

  3. Oracle資料庫中不存在鎖定擴大,而DB2資料庫中當資料庫表中行級鎖的使用超過locklist*maxlocks會發生鎖定擴大。

  4. 在Oracle中當一個session對錶進行insert,update,delete時候,另外一個session仍然可以從Orace復原段或者還原資料表空間中讀取該表的前映象(before image); 而在DB2中當一個session對錶進行insert,update,delete時候,另外一個session仍然在讀取該表資料時候會處於lock wait狀態,除非使用UR隔離等級可以讀取第一個session的未提交的值;所以Oracle同一時刻不同的session有讀不一致的現象,而DB2在同一時刻所有的session都是“讀一致”的。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.