版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、nvl Oracle 的并發(fā)控制與多版本oracle nvl:Oracle的并發(fā)控制與多版本開發(fā)多用戶數(shù)據(jù)庫應(yīng)用,最大的難題之一是:一方面要力爭最大的并發(fā)訪問,而同時還要確保每一用戶能以一致的方式讀取和修改數(shù)據(jù)。力爭最大的并發(fā)訪問需要用鎖定機(jī)制,而確保一致讀和修改數(shù)據(jù)則需要一些并發(fā)控制機(jī)制。1.并發(fā)控制并發(fā)控制(concurrency control)是數(shù)據(jù)庫提供的函數(shù)集合,允許多個人同時訪問和修改數(shù)據(jù)。鎖(lock)是Oracle管理共享數(shù)據(jù)庫資源并發(fā)訪問并防止并發(fā)數(shù)據(jù)庫事務(wù)之間相互干涉的核心機(jī)制之一??偨Y(jié)一下,Oracle使用了多種鎖,包括:TX鎖:修改數(shù)據(jù)的事務(wù)在執(zhí)行期間會獲得這種鎖。T
2、M鎖和DDL鎖:在你修改一個對象的內(nèi)容(對于TM鎖)或?qū)ο蟊旧?對應(yīng)DDL鎖)時,這些鎖可以確保對象的結(jié)構(gòu)不被修改。閂(latch):這是Oracle的內(nèi)部鎖,用來協(xié)調(diào)對其共享數(shù)據(jù)結(jié)構(gòu)的訪問。Oracle對并發(fā)的支持不僅使用高效的鎖定,還實現(xiàn)了一種多版本體系結(jié)構(gòu),它提供了一種受控但高度并發(fā)的數(shù)據(jù)訪問。這里的多版本指的是可以同時地物化多個版本的數(shù)據(jù),這也是Oracle提供讀一致性視圖的機(jī)制。多版本有一個很好的副作用,即數(shù)據(jù)的讀取器(reader)絕對不會被數(shù)據(jù)的寫入器(writer)所阻塞。換句話說,寫不會阻塞讀。這是Oracle與其他數(shù)據(jù)庫之間的一個根本區(qū)別。默認(rèn)情況下,Oracle的讀一致性
3、多版本視圖是應(yīng)用與語句級的,即對應(yīng)與每一個查詢。也可以改為事務(wù)級的。數(shù)據(jù)庫中事務(wù)的基本作用是將數(shù)據(jù)庫從一種一致狀態(tài)轉(zhuǎn)變?yōu)榱硪环N一種狀態(tài)。ISO SQL標(biāo)準(zhǔn)指定了多種事務(wù)隔離級別(transaction isolation level),這些隔離級別定義了一個事務(wù)對其他事務(wù)做出的修改有多敏感。越是敏感,數(shù)據(jù)庫在應(yīng)用執(zhí)行的各個事務(wù)之間必須提供的隔離程度就越高。2.事務(wù)隔離級別ANSI/ISO SQL標(biāo)準(zhǔn)定義了4種事務(wù)隔離級別,對于相同的事務(wù),采用不同的隔離級別分別有不同的結(jié)果。也就是說,即使輸入相同,而且采用同樣的方式來完成同樣的工作,也可能得到完全不同的答案,這取決于事務(wù)的隔離級別。這些隔離級別
4、是根據(jù)3個現(xiàn)象定義的,以下就是給定隔離級別可能允許或不允許的3種現(xiàn)象:a)臟讀(dirty read):你能讀取未提交的數(shù)據(jù),也就是臟數(shù)據(jù)。只要打開別人正在讀寫的一個OS文件(不論文件中有什么數(shù)據(jù)),就可以達(dá)到臟讀的效果。如果允許臟讀,將影響數(shù)據(jù)完整性,另外外鍵約束會遭到破壞,而且會忽略惟一性約束。b)不可重復(fù)讀(nonrepeatable read):這意味著,如果你在T1時間讀取某一行,在T2時間重新讀取這一行時,這一行可能已經(jīng)有所修改。也許它已經(jīng)消失,有可能被更新了,等等。這里的修改是已經(jīng)提交了的,與臟讀不同。c)幻像讀(phantom read):這說明,如果你在T1時間執(zhí)行一個查詢,
5、而在T2時間再執(zhí)行這個查詢,此時可能已經(jīng)向數(shù)據(jù)庫中增加了另外的行,這會影響你的結(jié)果。與不可重復(fù)讀的區(qū)別在于:在幻像讀中,已經(jīng)讀取的數(shù)據(jù)不會改變,只是與以前相比,會有更多的數(shù)據(jù)滿足你的查詢條件。SQL隔離級別是根據(jù)這些現(xiàn)象來描述級別的,并沒有強(qiáng)制采用某種特定的鎖定機(jī)制或硬性規(guī)定的特定行為,這就允許多種不同的鎖定/并發(fā)機(jī)制存在。表1 ANSI隔離級別隔離級別臟讀不可重復(fù)讀幻像讀READ UNCOMMITTED允許允許允許READ COMMITTED允許允許REPEATABLE READ允許SERIALIZABLE SQL的隔離級別表明Read Committed不能提供一致性的結(jié)果,因為有可能產(chǎn)生
6、不可重復(fù)讀和幻想讀,而在Oracle中,Read Committed則有得到讀一致查詢所需的屬性。另外,Oracle還秉承了READ UNCOMMITTED的精神。(有些數(shù)據(jù)庫)提供臟讀的目的是為了支持非阻塞讀,也就是說,查詢不會被同一個數(shù)據(jù)的更新所阻塞,也不會因為查詢而阻塞同一數(shù)據(jù)的更新。不過,Oracle不需要臟讀來達(dá)到這個目的,而且也不支持臟讀。但在其他數(shù)據(jù)庫中必須實現(xiàn)臟讀來提供非阻塞讀。除了SQL定義的4個隔離級別外,Oracle還定義了另外一個級別,叫做Read Only。READ ONLY事務(wù)相對于無法在SQL中完成任何修改的REPEATABLE READ或SERIALIZABLE
7、事務(wù)。如果事務(wù)使用READ ONLY隔離級別,只能看到事務(wù)開始那一刻提交的修改,但是插入、更新和刪除不允許采用這種模式(其他會話可以更新數(shù)據(jù),但是READ ONLY事務(wù)不行)。如果使用這種模式,可以得到REPEATABLE READ和SERIALIZABLE級別的隔離性。以下分別介紹一下這幾個隔離級別。2.1 READ UNCOMMITTED這個隔離級別允許臟讀,但Oracle不利用臟讀,甚至不允許臟讀。其實Read Uncommitted的根本目標(biāo)是提供一個基于標(biāo)準(zhǔn)的定義以支持非阻塞讀。而Oracle是默認(rèn)支持非阻塞讀的。臟讀是不是一個特性,而是一個缺點(diǎn)。Oracle根本不需要臟讀,Orac
8、le可以完全得到臟讀的所有好處(即無阻塞),而不會帶來任何不正確的結(jié)果。它是怎么實現(xiàn)的?當(dāng)我們在開始的時候查詢一個表中的數(shù)據(jù),并修改了這個數(shù)據(jù),而在事務(wù)的過程中如果有其他事務(wù)準(zhǔn)備查詢這個數(shù)據(jù),Oracle會使用多版本創(chuàng)建該塊的一個副本,包含原來沒修改的值,這樣一來,Oracle就有效地繞過了已修改的數(shù)據(jù),它沒有讀修改后的值,而是從undo段,也稱為回滾(rollback)重新建立原數(shù)據(jù)。因此可以返回一致而且正確的答案,而無需等待事務(wù)提交。而那些允許臟讀的數(shù)據(jù)庫就會讀到修改過的數(shù)據(jù)。2.2 READ COMMITTED READ COMMITTED隔離級別是指,事務(wù)只能讀取數(shù)據(jù)庫中已經(jīng)提交的數(shù)據(jù)
9、。這里沒有臟讀,不過可能有不可重復(fù)讀(也就是說,在同一個事務(wù)中重復(fù)讀取同一行可能返回不同的答案)和幻像讀(與事務(wù)早期相比,查詢不光能看到已經(jīng)提交的行,還可以看到新插入的行)。在數(shù)據(jù)庫應(yīng)用中,READ COMMITTED可能是最常用的隔離級別了,這也是Oracle數(shù)據(jù)庫的默認(rèn)模式,很少看到使用其他的隔離級別。在Oracle中,由于使用多版本和讀一致查詢,無論是使用READ COMMITTED還是使用READ UNCOMMITTED,對同一表進(jìn)行查詢得到的答案總是一樣的。Oracle會按查詢開始時數(shù)據(jù)的樣子對已修改的數(shù)據(jù)進(jìn)行重建,恢復(fù)其本來面目,因此會返回數(shù)據(jù)庫在查詢開始時的答案。如果采用其他數(shù)據(jù)
10、庫在Read Committed隔離級別時,別的用戶在查詢期間如果事務(wù)未提交,則別的用戶需要等待,直到事務(wù)提交,而且最后得到的結(jié)果還可能不正確(因為不可重復(fù)讀)。自己建了一個測試表t,發(fā)現(xiàn)Oracle的事務(wù)隔離級別為Read Committed時,不可重復(fù)讀現(xiàn)象是會產(chǎn)生的。具體做法如下(下一行的時間比上一行后):會話1:會話2 create table t(x int);insert into tvalues(1);insert into tvalues(2);commit;delete from twhere x=2(開始事務(wù))update tset x=10 where x=1 selec
11、t*from t(x=1)commit;select*from t(x=10)commit;可見Oracle的Read Commited還是會返回不同的結(jié)果的。不知道書中為什么說會返回同樣的結(jié)果。望高手解答!(這里要得到一致的結(jié)果只能設(shè)為SEAIALIZABLE才能得到,而且還要每次transaction開始的時候設(shè)定)2.3 REPEATABLE READ REPEATABLE READ的目標(biāo)是提供這樣一個隔離級別,它不僅能給出一致的正確答案,還能避免丟失更新。一致性讀:如果隔離級別是REPEATABLE READ,從給定查詢得到的結(jié)果相對于某個時間點(diǎn)來說應(yīng)該是一致的。大多數(shù)數(shù)據(jù)庫(不包括O
12、racle)都通過使用低級的共享讀鎖來實現(xiàn)可重復(fù)讀。共享讀鎖會防止其他會話修改我們已經(jīng)讀取的數(shù)據(jù)。當(dāng)然,這會降低并發(fā)性。Oracle則采用了更具并發(fā)性的多版本模型來提供讀一致的答案。在Oracle中,通過使用多版本,得到的答案相對于查詢開始執(zhí)行那個時間點(diǎn)是一致的。在其他數(shù)據(jù)庫中,通過使用共享讀鎖,可以得到相對于查詢完成那個時間點(diǎn)一致的答案,也就是說,查詢結(jié)果相對于我們得到的答案的那一刻是一致的.但是使用共享讀鎖來得到一致性的結(jié)果有副作用之一:數(shù)據(jù)的讀取器會阻塞數(shù)據(jù)的寫入器。它會影響并發(fā)性。還有一個副作用是數(shù)據(jù)的讀取器經(jīng)常和寫入器互相死鎖。可以看到,Oracle中可以得到語句級的讀一致性,而不會
13、帶來讀阻塞寫的現(xiàn)象,也不會導(dǎo)致死鎖。Oracle從不使用共享讀鎖,從來不會。Oracle選擇了多版本機(jī)制,盡管更難實現(xiàn),但絕對更具并發(fā)性。丟失更新:在采用共享讀鎖的數(shù)據(jù)庫中,REPEATABLE READ的一個常見用途是防止丟失更新。在一個采用共享讀鎖(而不是多版本)的數(shù)據(jù)庫中,如果啟用了REPEATABLE READ,則不會發(fā)生丟失更新錯誤。這些數(shù)據(jù)庫中之所以不會發(fā)生丟失更新,原因是:這樣選擇數(shù)據(jù)就會在上面加一個鎖,數(shù)據(jù)一旦由一個事務(wù)讀取,就不能被任何其他事務(wù)修改。如此說來,如果你的應(yīng)用認(rèn)為REPEATABLE READ就意味著丟失更新不可能發(fā)生,等你把應(yīng)用移植到一個沒有使用共享讀鎖作為底層
14、并發(fā)控制機(jī)制的數(shù)據(jù)庫時,就會痛苦地發(fā)現(xiàn)與你預(yù)想的并不一樣。盡管聽上去使用共享讀鎖好像不錯,但你必須記住,如果讀取數(shù)據(jù)時在所有數(shù)據(jù)上都加共享讀鎖,這肯定會嚴(yán)重地限制并發(fā)讀和修改。所以,盡管在這些數(shù)據(jù)庫中這個隔離級別可以防止丟失更新,但是與此同時,也使得完成并發(fā)操作的能力化為烏有!對于這些數(shù)據(jù)庫,你無法魚和熊掌兼得。2.4 SEAIALIZABLE一般認(rèn)為這是最受限的隔離級別,但是它也提供了最高程度的隔離性。SERIALIZABLE事務(wù)在一個環(huán)境中操作時,就好像沒有別的用戶在修改數(shù)據(jù)庫中的數(shù)據(jù)一樣。我們讀取的所有行在重新讀取時都肯定完全一樣,所執(zhí)行的查詢在整個事務(wù)期間也總能返回相同的結(jié)果。Orac
15、le采用了一種樂觀的方法來實現(xiàn)串行化,它認(rèn)為你的事務(wù)想要更新的數(shù)據(jù)不會被其他事務(wù)所更新,而且把寶押在這上面。一般確實是這樣的,所以說通常這個寶是押對了,特別是在事務(wù)執(zhí)行得很快的OLTP型系統(tǒng)中。盡管在其他系統(tǒng)中這個隔離級別通常會降低并發(fā)性,但是在Oracle中,倘若你的事務(wù)在執(zhí)行期間沒有別人更新你的數(shù)據(jù),則能提供同等程度的并發(fā)性,就好像沒有SERIALIZABLE事務(wù)一樣。另一方面,這也是有缺點(diǎn)的,如果寶押錯了,你就會得到ORA_08177錯誤。Oracle試圖完全在行級得到這種隔離性,但是即使你想修改的行尚未被別人修改后,也可能得到一個ORA-01877錯誤。發(fā)生ORA-01877錯誤的原因
16、可能是:包含這一行的塊上有其他行正在被修改。2.5 READ ONLY READ ONLY事務(wù)與SERIALIZABLE事務(wù)很相似,惟一的區(qū)別是READ ONLY事務(wù)不允許修改,因此不會遭遇ORA-08177錯誤。READ ONLY事務(wù)的目的是支持報告需求,即相對于某個時間點(diǎn),報告的內(nèi)容應(yīng)該是一致的。在其他系統(tǒng)中,為此要使用REPEATABLE READ,這就要承受共享讀鎖的相關(guān)影響。在Oracle中,則可以使用READ ONLY事務(wù)。采用這種模式,如果一個報告使用50條SELECT語句來收集數(shù)據(jù),所生成的結(jié)果相對于某個時間點(diǎn)就是一致的,即事務(wù)開始的那個時間點(diǎn)。你可以做到這一點(diǎn),而無需在任何地
17、方鎖定數(shù)據(jù)。為達(dá)到這個目標(biāo),就像對單語句一樣,也使用了同樣的多版本機(jī)制。會根據(jù)需要從回滾段重新創(chuàng)建數(shù)據(jù),并提供報告開始時數(shù)據(jù)的原樣。不過,READ ONLY事務(wù)也不是沒有問題。在SERIALIZABLE事務(wù)中你可能會遇到ORA-08177錯誤,而在READ ONLY事務(wù)中可能會看到ORA-1555:snapshot too old錯誤。如果系統(tǒng)上有人正在修改你讀取的數(shù)據(jù),就會發(fā)生這種情況。對這個信息所做的修改(undo信息)將記錄在回滾段中。但是回滾段以一種循環(huán)方式使用,這與重做日志非常相似。報告運(yùn)行的時間越長,重建數(shù)據(jù)所需的undo信息就越有可能已經(jīng)不在那里了。回滾段會回繞,你需要的那部分回
18、滾段可能已經(jīng)被另外某個事務(wù)占用了。此時,就會得到ORA-1555錯誤,只能從頭再來。3.多版本讀一致性的含義我們要理解多版本的機(jī)制和含義,才能正確地得到我們想要的結(jié)果。例如在常用的數(shù)據(jù)倉庫技術(shù)中,我們經(jīng)常是在某個時刻t1從事務(wù)系統(tǒng)拉出數(shù)據(jù),作為最初填充數(shù)據(jù)倉庫的數(shù)據(jù),然后在過一段時間后,在時刻t2,再從事務(wù)系統(tǒng)拉出自t1時刻修改過的所有記錄,并把修改合并到數(shù)據(jù)倉庫中。這一種方式對于其他讀會被寫阻塞,寫會被讀阻塞的系統(tǒng)來說,確是可以很好工作。因為在t1時刻如果存在被修改的行,那么我們讀的時候會堵塞,直到事務(wù)提交,那么t1到t2修改過的所有記錄會包括這一行。但如果采用多版本,同樣的一行在t1時刻之
19、前已被修改,但未提交,那么還采用這個策略的話,只會拉出t1時刻未修改的數(shù)據(jù)。然后在t2時刻拉出自t1時刻修改過的所有記錄,但是這一行是t1時刻之前修改的,所以不包含在內(nèi)。所以我們永遠(yuǎn)到拉不到那個在t1時刻之前修改的數(shù)據(jù)。解決的方式是我們需要用稍微不同的方式來得到現(xiàn)在的時間。應(yīng)該查詢V$TRANSACTION,找出最早的當(dāng)前時間是什么,以及這個視圖中START_TIME列記錄的時間。我們需要拉出自最老事務(wù)開始時間(如果沒有活動事務(wù),則取當(dāng)前的SYSDATE值)以來經(jīng)過修改的所有記錄:selectnvl(min(to_date(start_time,mm/dd/rr hh24:mi:ss),sys
20、date)from v$transaction;這樣他會得到在t1之前這樣被修改的時間,并拉出自那個時間以來修改的數(shù)據(jù),最后把修改合并到數(shù)據(jù)倉庫中。還有一個例子是熱表上的I/O超出期望值,這就是生產(chǎn)環(huán)境中在一個大負(fù)載條件下,一個查詢使用的I/O比你在測試或開發(fā)系統(tǒng)時觀察到的I/O要多得多,而你無法解釋這一現(xiàn)象。你查看查詢執(zhí)行的I/O時,注意到它比你在開發(fā)系統(tǒng)中看到的I/O次數(shù)要多得多,多得簡直不可想像。然后,你再在測試環(huán)境中恢復(fù)這個實例,卻發(fā)現(xiàn)I/O又降下來了。但是到了生產(chǎn)環(huán)境中,它又變得非常高(但是好像還有些變化:有時高,有時低,有時則處于中間)??梢钥吹剑斐蛇@種現(xiàn)象的原因是:在你測試系統(tǒng)
21、中,由于它是獨(dú)立的,所以不必撤銷事務(wù)修改。不過,在生產(chǎn)系統(tǒng)中,讀一個給定的塊時,可能必須撤銷(回滾)多個事務(wù)所做的修改,而且每個回滾都可能涉及I/O來獲取undo信息并應(yīng)用于系統(tǒng)。4.寫一致性現(xiàn)在來看看寫方面會怎樣,例如運(yùn)行以下語句:Update tset x=2 where y=5在該語句運(yùn)行時,有人將這條語句已經(jīng)讀取的一行從Y=5更新為Y=6,并提交,如果是這樣會發(fā)生什么情況?也就是說,在UPDATE開始時,某一行有值Y=5。在UPDATE使用一致讀來讀取表時,它看到了UPDATE開始時這一行是Y=5。但是,現(xiàn)在Y的當(dāng)前值是6,不再是5了,在更新X的值之前,Oracle會查看Y是否還是5。
22、現(xiàn)在會發(fā)生什么呢?這會對更新有什么影響?顯然,我們不能修改塊的老版本,修改一行時,必須修改該塊的當(dāng)前版本。另外,Oracle無法簡單地跳過這一行,因為這將是不一致讀,而且是不可預(yù)測的。在這種情況下,我們發(fā)現(xiàn)Oracle會從頭重新開始寫修改。4.1一致讀和當(dāng)前讀Oracle處理修改語句時會完成兩類塊獲取。它會執(zhí)行:一致讀(Consistent read):發(fā)現(xiàn)要修改的行時,所完成的獲取就是一致讀。當(dāng)前讀(Current read):得到塊來實際更新所要修改的行時,所完成的獲取就是當(dāng)前讀。如果兩個會話按順序執(zhí)行以下語句會發(fā)生什么情況呢?例如Update tset y=10 where y=5;Update tSet x=x+1
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026貴州安順市平壩第一高級中學(xué)公費(fèi)師范生及高層次人才引進(jìn)(第二批)考試參考試題及答案解析
- 力學(xué)保研面試真題及答案
- 2025年九省聯(lián)考試題生物及答案
- 天然氣回收項目運(yùn)營管理方案
- 2025廣西壯族自治區(qū)文化和旅游廳幼兒園保育員招聘1人備考考試題庫及答案解析
- 雨水管網(wǎng)維護(hù)與管理策略
- 2026中國農(nóng)業(yè)科學(xué)院第一批招聘(中國農(nóng)業(yè)科學(xué)院農(nóng)產(chǎn)品加工研究所)考試備考題庫及答案解析
- 標(biāo)準(zhǔn)廠房施工現(xiàn)場臨時設(shè)施規(guī)劃方案
- 計算機(jī)硬件防雷專員面試題目庫
- 隧道施工機(jī)械設(shè)備維護(hù)方案
- 2025中原農(nóng)業(yè)保險股份有限公司招聘67人筆試備考重點(diǎn)試題及答案解析
- 2025中原農(nóng)業(yè)保險股份有限公司招聘67人備考考試試題及答案解析
- 2025年違紀(jì)違法典型案例個人學(xué)習(xí)心得體會
- 2025年度河北省機(jī)關(guān)事業(yè)單位技術(shù)工人晉升高級工考試練習(xí)題附正確答案
- 交通運(yùn)輸布局及其對區(qū)域發(fā)展的影響課時教案
- 2025年中醫(yī)院護(hù)理核心制度理論知識考核試題及答案
- GB/T 17981-2025空氣調(diào)節(jié)系統(tǒng)經(jīng)濟(jì)運(yùn)行
- 比亞迪儲能項目介紹
- 2025 年高職酒店管理與數(shù)字化運(yùn)營(智能服務(wù))試題及答案
- 2025年9月廣東深圳市福田區(qū)事業(yè)單位選聘博士11人備考題庫附答案
- 糖尿病足潰瘍VSD治療創(chuàng)面氧自由基清除方案
評論
0/150
提交評論