Posted on 2010-01-14 21:57
斷點 閱讀(521)
評論(0) 編輯 收藏 所屬分類:
Oracle
數(shù)據(jù)庫使用鎖(lock)來保證任何給定時刻最多只有一個事務(wù)在修改給定的一段數(shù)據(jù)。實質(zhì)上講,正是鎖機(jī)制才使并發(fā)控制成為可能。
ORACLE的封鎖策略:
1、只有當(dāng)修改時,Oracle在行級上鎖定數(shù)據(jù),不要把鎖定上升到塊或表級。
2、Oracle決不會為讀取而鎖定數(shù)據(jù),簡單讀取不能在數(shù)據(jù)行上設(shè)置鎖定。
3、數(shù)據(jù)的寫入器不會阻塞數(shù)據(jù)讀取器。
4、只有當(dāng)另一個數(shù)據(jù)寫入器已經(jīng)鎖定了某行數(shù)據(jù)后,才阻塞其他人對該行數(shù)據(jù)的寫入。數(shù)據(jù)的讀取器決不會阻塞數(shù)據(jù)的寫入器。
-------------------------------------------------------------------------
Oracle并發(fā)處理機(jī)制的簡單看法。http://www.51testing.com/html/97/n-131297.html
轉(zhuǎn)載內(nèi)容如下:
在Oracle開發(fā)過程中,如果你只是獨立地測試你的應(yīng)用,然后部署,并交給數(shù)十個并發(fā)用戶使用,就很有可能痛苦地遭遇原先未能檢測到的并發(fā)問題。例如,2個用戶同時修改某張訂單,首先他們會查詢這張訂單存在不存在,如果存在,那么修改它的狀態(tài)。在并發(fā)操作中,用戶1會很奇怪的發(fā)現(xiàn)他的修改丟失了。當(dāng)然,除此之外,在未能夠很好的處理并發(fā)問題可能遭遇的情況還有:
◆破壞數(shù)據(jù)的完整性。
◆隨著用戶數(shù)的增多,應(yīng)用的運(yùn)行速度減慢。
◆不能很好地擴(kuò)縮應(yīng)用來支持大量用戶。
為解決這些問題。首先要引入的是ORACLE的鎖機(jī)制。數(shù)據(jù)庫使用鎖(lock)來保證任何給定時刻最多只有一個事務(wù)在修改給定的一段數(shù)據(jù)。實質(zhì)上講,正是鎖機(jī)制才使并發(fā)控制成為可能。對ORACLE的鎖機(jī)制可以查看ORACLE官方文檔介紹。以下是對ORACLE鎖的一點總結(jié)。
Oracle只在修改時才對數(shù)據(jù)加行級鎖。正常情況下不會升級到塊級鎖或表級鎖(不過兩段提交期間的一段很短的時間內(nèi)除外,這是一個不常見的操作)。
◆如果只是讀數(shù)據(jù),Oracle絕不會對數(shù)據(jù)鎖定。不會因為簡單的讀操作在數(shù)據(jù)行上鎖定。
◆寫入器(writer)不會阻塞讀取器(reader)。換種說法:讀(read)不會被寫(write)阻塞。這一點幾乎與其他所有數(shù)據(jù)庫都不一樣。在其他數(shù)據(jù)庫中,讀往往會被寫阻塞。盡管聽上去這個特性似乎很不錯(一般情況下確實如此),但是,如果你沒有充分理解這個思想,而且想通過應(yīng)用邏輯對應(yīng)用施加完整性約束,就極有可能做得不對。
◆寫入器想寫某行數(shù)據(jù),但另一個寫入器已經(jīng)鎖定了這行數(shù)據(jù),此時該寫入器才會被阻塞。讀取器絕對不會阻塞寫入器。
開發(fā)人員要盡可能的考慮以上因素。而且還要意識到這些事ORACLE獨有的。針對其他數(shù)據(jù)庫,在鎖的應(yīng)用上略有不同。
以DB2為例
1.Oracle通過具有意向鎖的多粒度封鎖機(jī)制進(jìn)行并發(fā)控制,保證數(shù)據(jù)的一致性。其DML鎖(數(shù)據(jù)鎖)分為兩個層次(粒度):即表級和行級。通常的DML操作在表級獲得的只是意向鎖(RS或RX),其真正的封鎖粒度還是在行級;DB2也是通過具有意向鎖的多粒度封鎖機(jī)制進(jìn)行并發(fā)控制,保證數(shù)據(jù)的一致性。
其DML鎖(數(shù)據(jù)鎖)分為兩個層次(粒度):即表級和行級。通常的DML操作在表級獲得的只是意向鎖(IS,SIX或IX),其真正的封鎖粒度也是在行級;另外,在Oracle數(shù)據(jù)庫中,單純地讀數(shù)據(jù)(SELECT)并不加鎖,這些都提高了系統(tǒng)的并發(fā)程度,Oracle強(qiáng)調(diào)的是能夠“讀”到數(shù)據(jù),并且能夠快速的進(jìn)行數(shù)據(jù)讀取。而DB2的鎖強(qiáng)調(diào)的是“讀一致性”,進(jìn)行讀數(shù)據(jù)(SELECT)時會根據(jù)不同的隔離級別(RR,RS,CS)而分別加S,IS,IS鎖,只有在使用UR隔離級別時才不加鎖。從而保證不同應(yīng)用程序和用戶讀取的數(shù)據(jù)是一致的。
2. 在支持高并發(fā)度的同時,DB2和Oracle對鎖的操縱機(jī)制有所不同:Oracle利用意向鎖及數(shù)據(jù)行上加鎖標(biāo)志位等設(shè)計技巧,減小了Oracle維護(hù)行級鎖的開銷,使其在數(shù)據(jù)庫并發(fā)控制方面有著一定的優(yōu)勢。而DB2中對每個鎖會在鎖的內(nèi)存(locklist)中申請分配一定字節(jié)的內(nèi)存空間,具體是X鎖64字節(jié)內(nèi)存,S鎖32字節(jié)內(nèi)存(注:DB2 V8之前是X鎖72字節(jié)內(nèi)存而S鎖36字節(jié)內(nèi)存)。
3. Oracle數(shù)據(jù)庫中不存在鎖升級,而DB2數(shù)據(jù)庫中當(dāng)數(shù)據(jù)庫表中行級鎖的使用超過locklist*maxlocks會發(fā)生鎖升級。
4. 在Oracle中當(dāng)一個session對表進(jìn)行insert,update,delete時候,另外一個session仍然可以從Orace回滾段或者還原表空間中讀取該表的前映象(before image); 而在DB2中當(dāng)一個session對表進(jìn)行insert,update,delete時候,另外一個session仍然在讀取該表數(shù)據(jù)時候會處于lock wait狀態(tài),除非使用UR隔離級別可以讀取第一個session的未提交的值;所以O(shè)racle同一時刻不同的session有讀不一致的現(xiàn)象,而DB2在同一時刻所有的session都是“讀一致”的。
posted @ 2009-11-28 17:50 斷點 閱讀(24) | 評論 (0)