一個高人寫的oracle資料_第1頁
一個高人寫的oracle資料_第2頁
一個高人寫的oracle資料_第3頁
一個高人寫的oracle資料_第4頁
一個高人寫的oracle資料_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、.:.;一個高人寫的oracle資料嘆為觀止2007-12-01 來源: HYPERLINK database.e800 t _blank e800數(shù)據(jù)庫頻道 作者: 關(guān)鍵詞: HYPERLINK search.e800/search?keyword=RAC&searchDomain=0 RAC 我們從一個用戶懇求開場講,ORACLE的完好的任務(wù)機(jī)制是怎樣的,首先一個用戶進(jìn)程發(fā)出一個銜接懇求,假設(shè)運用的是主機(jī)命名或者是本地效力命中的主機(jī)名運用的是機(jī)器名(非IP地址),那么這個懇求都會經(jīng)過DNS效力器或HOST文件的效力名解析然后傳送到ORACLE監(jiān)聽進(jìn)程,監(jiān)聽進(jìn)程接納到用戶懇求后會采取兩種方式

2、來處置這個用戶懇求,下面我們分公用效力器和共享效力器分別采用這兩種方式時的情況來講:公用效力器方式下:一種方式是監(jiān)聽進(jìn)程接納到用戶進(jìn)程懇求后,產(chǎn)生一個新的公用效力器進(jìn)程,并且將對用戶進(jìn)程的一切控制信息傳給此效力器進(jìn)程,也就是說新建的效力器進(jìn)程承繼了監(jiān)聽進(jìn)程的信息,然后效力器進(jìn)程給用戶進(jìn)程發(fā)一個RESEND包,通知用戶進(jìn)程可以開場給它發(fā)信息了,用戶進(jìn)程給這個新建的效力器進(jìn)程發(fā)一個CONNECT包,效力器進(jìn)程再以ACCEPT包回運用戶進(jìn)程,致此,用戶進(jìn)程正式與效力器進(jìn)程確定銜接。我們把這種銜接叫做HAND-OFF銜接,也叫轉(zhuǎn)換銜接。另一種方式是監(jiān)聽進(jìn)程接納到用戶進(jìn)程的懇求后產(chǎn)生一個新的公用效力器進(jìn)

3、程,這個效力器進(jìn)程選用一個TCP/IP端口來控制與用戶進(jìn)程的交互,然后將此信息回傳給監(jiān)聽進(jìn)程,監(jiān)聽進(jìn)程再將此信息傳給用戶進(jìn)程,用戶進(jìn)程運用這個端口給效力器進(jìn)程發(fā)送一個CONNECT包,效力器進(jìn)程再給用戶進(jìn)程發(fā)送一個ACCEPT包,致此,用戶進(jìn)程可以正式向效力器進(jìn)程發(fā)送信息了。這種方式我們叫做重定向銜接。HAND-OFF銜接需求系統(tǒng)平臺具有進(jìn)程承繼的才干,為了使WINDOWS NT/2000支持HAND-OFF必需在HKEY_LOCAL_MACHINESOFTWAREORACLEHOMEX中設(shè)置USE_SHARED_SOCKET。共享效力器方式下:只需重定向銜接的方式,任務(wù)方式是監(jiān)聽進(jìn)程接納到用

4、戶進(jìn)程的懇求后產(chǎn)生一個新的調(diào)度進(jìn)程,這個調(diào)度進(jìn)程選用一個TCP/IP端口來控制與用戶進(jìn)程的交互,然后將此信息回傳給監(jiān)聽進(jìn)程,監(jiān)聽進(jìn)程再將此信息傳給用戶進(jìn)程,用戶進(jìn)程運用這個端口給調(diào)度進(jìn)程發(fā)送一個CONNECT包,調(diào)度進(jìn)程再給用戶進(jìn)程發(fā)送一個ACCEPT包,致此,用戶進(jìn)程可以正式向調(diào)度進(jìn)程發(fā)送信息了。可以經(jīng)過設(shè)置MAX_DISPIATCHERS這個參數(shù)來確定調(diào)度進(jìn)程的最大數(shù)目,假設(shè)調(diào)度進(jìn)程的個數(shù)曾經(jīng)到達(dá)了最大,或者已有的調(diào)度進(jìn)程不是滿負(fù)荷,監(jiān)聽進(jìn)程將不再創(chuàng)建新的調(diào)度進(jìn)程,而是讓其中一個調(diào)度進(jìn)程選用一個TCP/IP端口來與此用戶進(jìn)程交互。調(diào)度進(jìn)程每接納一個用戶進(jìn)程懇求都會在監(jiān)聽進(jìn)程處作一個登記,以

5、便監(jiān)聽進(jìn)程可以平衡每個調(diào)度進(jìn)程的負(fù)荷,一切的用戶進(jìn)程懇求將分別在有限的調(diào)度進(jìn)程中排隊,一切調(diào)度進(jìn)程再順序的把各自隊列中的部分用戶進(jìn)程懇求放入同一個懇求隊列,等候多個ORACLE的共享效力器進(jìn)程進(jìn)展處置可以經(jīng)過SHARED_SERVERS參數(shù)設(shè)置共享效力器進(jìn)程的個數(shù),也就是說一切的調(diào)度進(jìn)程共享同一個懇求隊列,共享效力器方式下一個實例只需一個懇求隊列,共享效力器進(jìn)程處置完用戶進(jìn)程的懇求后將根據(jù)用戶進(jìn)程懇求取自不同的調(diào)度進(jìn)程將前往結(jié)果放入不同的呼應(yīng)隊列,也就是說有多少調(diào)度進(jìn)程就有多少呼應(yīng)隊列,然后各個調(diào)度進(jìn)程從各自的呼應(yīng)隊列中將結(jié)果取出再前往給用戶進(jìn)程。以上我們講完了用戶與ORACLE的銜接方式,下

6、面我們要講ORACLE效力器進(jìn)程如可處置用戶進(jìn)程的懇求,當(dāng)一個用戶進(jìn)程發(fā)出了一條SQL語名:UPDATE TABBLEA SET SALARY=SALARY*2;首先,效力器進(jìn)程把這條語句的字符轉(zhuǎn)換成ASCII等效數(shù)字碼,接著這個ASCII碼被傳送給一個HASH函數(shù),并前往一個HASH值,效力器進(jìn)程將到SHARED POOL 的共享PL/SQL區(qū)去查找能否存在同樣的HASH值,假設(shè)存在,效力器進(jìn)程將運用這條語句已高速緩存在SHARED POOL中的已分析過的版本來執(zhí)行,假設(shè)不存在,效力器進(jìn)程將對該語句進(jìn)展語法分析,首先檢查該語句的語法的正確性,接著對語句中涉及的表、索引、視圖等對象進(jìn)展解析,并

7、對照數(shù)據(jù)字典檢查這些對象的稱號以及相關(guān)構(gòu)造,并根據(jù)ORACLE選用的優(yōu)化方式以及數(shù)據(jù)字典中能否存在相應(yīng)對象的統(tǒng)計數(shù)據(jù)和能否運用了存儲大綱來生成一個執(zhí)行方案或從存儲大綱中選用一個執(zhí)行方案,然后再用數(shù)據(jù)字典核對此用戶對相應(yīng)對象的執(zhí)行權(quán)限,最后生成一個編譯代碼。ORACLE將這條語名的本身實踐文本、HASH值、編譯代碼、與此語名相關(guān)聯(lián)的任何統(tǒng)計數(shù)據(jù)和該語句的執(zhí)行方案緩存在SHARED POOL的共享PL/SQL區(qū)。效力器進(jìn)程經(jīng)過SHARED POOL 鎖存器來懇求可以向哪些共享PL/SQL區(qū)中緩存這此內(nèi)容,也就是說被SHARED POOL鎖存器鎖定的PL/SQL區(qū)中的塊不可被覆蓋,由于這些塊能夠被其

8、它進(jìn)程所運用。在SQL分析階段將用到LIBRARY CACHE,從數(shù)據(jù)字典中核對表、視圖等構(gòu)造的時候,需求將數(shù)據(jù)字典從磁盤讀入LIBRARY CACHE,因此,在讀入之前也要運用LIBRARY CACHE鎖存器來懇求用于緩存數(shù)據(jù)字典。生成編譯代碼之后,接著下一步效力器進(jìn)程要預(yù)備開場更新數(shù)據(jù),效力器進(jìn)程將到DB BUFFER中查找能否有相關(guān)對象的緩存數(shù)據(jù),下面分兩個能夠進(jìn)展解釋:假設(shè)沒有,效力器進(jìn)程將在表頭部懇求一些行鎖,假設(shè)勝利加鎖,效力器進(jìn)程將從數(shù)據(jù)文件中讀這些行所在的數(shù)據(jù)塊放入DB BUFFER中空閑的區(qū)域或者覆蓋已被擠出LRU列表的非臟數(shù)據(jù)塊緩沖區(qū),并且陳列在LRU列表的頭部,假設(shè)這些非

9、臟數(shù)據(jù)緩沖區(qū)寫完也不能滿足新數(shù)據(jù)的懇求時,會立刻觸發(fā)DBWN進(jìn)程將臟數(shù)據(jù)列表中指向的緩沖塊寫入數(shù)據(jù)文件,并且清洗掉這些緩沖區(qū),來騰出空間緩沖新讀入的數(shù)據(jù),也就是在放入DB BUFFER之前也是要先懇求DB BUFFER中的鎖存器,勝利鎖定后,再寫入DB BUFFER,然后效力器程將該語句影響的被讀入DB BUFFER塊中的這些行的ROWID及將要更新的原值和新值及SCN等信息逐條的寫入REDO LOG BUFFER,在寫入REDO LOG BUFFER之前也是先懇求REDO LOG BUFFER塊的鎖存器,勝利鎖定之后才開場寫入,當(dāng)寫入到達(dá)REDO LOG BUFFER大小的三分之一或?qū)懭肓康?/p>

10、達(dá)1M或超越三秒后或發(fā)生檢查點時或者DBWN之前發(fā)生,LGWR將把REDO LOG BUFFER中的數(shù)據(jù)寫入磁盤上的重做日志文件,已被寫入重做日志文件的REDO LOG BUFFER中的塊上的鎖存器被釋放,并可被后來寫入的信息所覆蓋,REDO LOG BUFFER以循環(huán)的方式任務(wù)。當(dāng)一個重做日志文件寫滿后,LGWR將切換到下一個重做日志文件,假設(shè)是歸檔方式,歸檔進(jìn)程還將前一個寫滿的重做日志進(jìn)程寫入歸檔日志文件,重作日志文件也是循環(huán)任務(wù)方式。寫完一切的REDO LOG BUFFER之后,效力器進(jìn)程開場改寫這個DB BUFFER塊頭部的事務(wù)列表并寫入SCN,然后COPY包含這個塊的頭部事務(wù)列表及S

11、CN信息的數(shù)據(jù)副本放入回滾段中,我們將回滾段中的副本稱為數(shù)據(jù)塊的“前映像?;貪L段可以存儲在專門的回滾表空間中,這個表空間由一個或多個物理文件組成,并公用于回滾表空間,回滾段也可在其它表空間中的數(shù)據(jù)文件中開辟。然后改寫這個DB BUFFER塊的數(shù)據(jù),并在其頭部寫入對應(yīng)的回滾段地址,假設(shè)對一行數(shù)據(jù)多次UPDATE而不COMMIT那么在回滾段中將會有多個“前映像,除第一個“前映像含有SCN信息外,其它的每個“前映像的頭部還含有SCN信息和“前前映像的回滾段地址。一次UPDATE操作只對應(yīng)一個SCN。然后效力器進(jìn)程在臟數(shù)據(jù)列表中建立一條指向此緩沖塊的指針。接著效力器進(jìn)程會從數(shù)據(jù)文件讀入第二個塊反復(fù)以上

12、讀入,記日志,建立回滾段,修正,放入臟列表的動作,當(dāng)臟數(shù)據(jù)列表到達(dá)一定長度時,DBWN進(jìn)程將臟數(shù)據(jù)列表中指向的緩沖塊全部寫入數(shù)據(jù)文件,也就是釋放加在這些DB BUFER 塊上的鎖存器。其實ORACLE可以一次從數(shù)據(jù)文件中讀入幾個塊放入DB BUFFER,可以經(jīng)過參數(shù)DB_FILE_MULTIBLOCK_READ_COUNT來設(shè)置一次讀入的塊的個數(shù)。假設(shè)要查找的數(shù)據(jù)已緩存,那么根據(jù)用戶的SQL操作類型決議如何操作,假設(shè)是SELECT 那么查看DB BUFFER塊的頭部能否有事務(wù),假設(shè)有,將從回滾段讀取,假設(shè)沒有那么比較SELECT 的SCN與DB BUFFER塊頭部的SCN假設(shè)比本人大,依然從回

13、滾段讀取,假設(shè)比本人小那么認(rèn)這是一個非臟緩存,可以直接從這個DB BUFFER塊中讀取。假設(shè)是UPDATE那么即使在DB BUFFER中找到一個沒有事務(wù),而且SCN比本人小的非臟緩存數(shù)據(jù)塊,效力器進(jìn)程依然要到表的頭部對這條記錄懇求加鎖,加鎖勝利那么進(jìn)展后續(xù)動作,假設(shè)不勝利,那么要等待前面的進(jìn)程解鎖后才干進(jìn)展動作。只需當(dāng)SQL語句影響的一切行所在的最后一個塊被讀入DB BUFFER并且重做信息被寫入REDO LOG BUFFER僅是指重做日志緩沖,而非重做日志文件之后,用戶才可以發(fā)出COMMIT,COMMIT觸發(fā)LGRW,但并不強迫立刻DBWN來釋放一切相應(yīng)的DB BUFFER塊上的鎖,也就是說

14、有能夠出現(xiàn)已COMMIT,但在隨后的一段時間內(nèi)DBWN還在寫這條語句涉及的數(shù)據(jù)塊的情形,表頭部的行鎖,并不是在COMMIT一發(fā)出就馬上釋放,實踐上要等到相應(yīng)的DBWN進(jìn)程終了才會釋放。一個用戶懇求鎖定另一個用戶已COMMIT的資源不勝利的時機(jī)是存在的,從COMMIT到DBWN進(jìn)程終了之間的時間很短,假設(shè)恰巧在這個時延續(xù)電,由于COMMIT已觸發(fā)LGWR進(jìn)程,所以這些未來得及寫入數(shù)據(jù)文件的改動會在實例重啟后由SMON進(jìn)程根據(jù)重做日志文件來前滾。假設(shè)未COMMIT就斷電,由于DBWN之前觸發(fā)LGWR,一切DBWN在數(shù)據(jù)文件上的修正都會被先一步記入重做日志文件,實例重啟后,SMON進(jìn)程再根據(jù)重做日志

15、文件來回滾。假設(shè)用戶ROOLBACK,那么效力器進(jìn)程會根據(jù)數(shù)據(jù)文件塊和DB BUFFER中塊的頭部的事務(wù)列表和SCN以及回滾段地址找到回滾段中相應(yīng)的修正前的副本,并且用這些原值來復(fù)原當(dāng)前數(shù)據(jù)文件中已修正但未提交的改動。假設(shè)有多個“前映像,效力器進(jìn)程會在一個“前映像的頭部找到“前前映像的回滾段地址,不斷找到同一事務(wù)下的最早的一個“前映像為止。一旦發(fā)出了COMMIT,用戶就不能ROOLBACK,這使得COMMIT后DBWN進(jìn)程還沒有全部完成的后續(xù)動作得到了保證。下面我們要提到檢查點的作用,當(dāng)一個全部檢查點發(fā)生的時候,首先讓LGWR進(jìn)程將REDO LOG BUFFER中的一切緩沖包含未提交的重做信息

16、寫入重做日志文件,然后讓DBWN進(jìn)程將DB BUFFER中一切已提交的緩沖寫入數(shù)據(jù)文件不強迫寫未提交的。然后更新控制文件和數(shù)據(jù)文件頭部的SCN,闡明當(dāng)前數(shù)據(jù)庫是一致的,假設(shè)在發(fā)生檢點之前斷電,并且當(dāng)時有一個未提交的改動正在進(jìn)展,實例重啟之后,SMON進(jìn)程將從上一個檢查點開場核對這個檢查點之后記錄在重做日志文件中已提交的和未提交改動,由于DBWN之前會觸發(fā)LGWR,所以DBWN對數(shù)據(jù)文件的修正一定會被先記錄在重做日志文件中。因此,斷電前被DBWN寫進(jìn)數(shù)據(jù)文件的改動將經(jīng)過重做日志文件中的記錄進(jìn)展復(fù)原,叫做回滾,假設(shè)斷電時有一個已提交,但DBWN動作還沒有完全完成的改動存在,由于曾經(jīng)提交,提交會觸發(fā)

17、LGWR進(jìn)程,所以不論DBWN動作能否已完成,該語句將要影響的行及其產(chǎn)生的結(jié)果一定曾經(jīng)記錄在重做日志文件中了,那么實例重啟后,SMON進(jìn)程根據(jù)重做日志文件進(jìn)展前滾。由此可見,實例失敗后用于恢復(fù)的時間由兩個檢查點之間的間隔大小來決議,我們可以通個四個參數(shù)設(shè)置檢查點執(zhí)行的頻率,LOG_CHECKPOINT_IMTERVAL決議了兩個檢查點之間寫入重做日志文件的系統(tǒng)物理塊的大小,LOG_CHECKPOINT_TIMEOUT決議了兩個檢查點之間的時間長度,F(xiàn)AST_START_IO_TARGET決議了用于恢復(fù)時需求處置的塊的大小,F(xiàn)AST_START_MTTR_TARGET直接決議了用于恢復(fù)的時間的長

18、短。SMON進(jìn)程執(zhí)行的前滾和回滾與用戶的回滾是不同的,SMON是根據(jù)重做日志文件進(jìn)展前滾或回滾,而用戶的回滾一定是根據(jù)回滾段的內(nèi)容進(jìn)展回滾的。在這里我們要說一下回滾段存儲的數(shù)據(jù),假設(shè)是delete操作,那么回滾段將會記錄整個行的數(shù)據(jù),假設(shè)是update,那么回滾段只記錄被修正了的字段的變化前的數(shù)據(jù)前映像,也就是沒有被修正的字段是不會被記錄的,假設(shè)是insert,那么回滾段只記錄插入記錄的rowid。這樣假設(shè)事務(wù)提交,那回滾段中簡單標(biāo)志該事務(wù)曾經(jīng)提交;假設(shè)是回退,那么假設(shè)操作是是delete,回退的時候把回滾段中數(shù)據(jù)重新寫回數(shù)據(jù)塊,操作假設(shè)是update,那么把變化前數(shù)據(jù)修正回去,操作假設(shè)是in

19、sert,那么根據(jù)記錄的rowid 把該記錄刪除。下面我們要講DBWN如何來寫數(shù)據(jù)文件,在寫數(shù)據(jù)文件前首先要找到可寫的空閑數(shù)據(jù)塊,ORACLE中空閑數(shù)據(jù)塊可以經(jīng)過FREELIST或BITMAP來維護(hù),它們位于一個段的頭部用來標(biāo)識當(dāng)前段中哪些數(shù)據(jù)塊可以進(jìn)展INSERT。在本地管理表空間中ORACLE自動管理分配給段的區(qū)的大小,區(qū)的分配信息存儲在組成表空間的數(shù)據(jù)文件的頭部,而數(shù)據(jù)字典管理的表空間用戶可以在創(chuàng)建時決議區(qū)的大小,并且區(qū)的分配信息是存儲在數(shù)據(jù)字典中的,只在本地管理的表空間中才干選用段自動管理,采用自動段空間管理的本地管理表空間中的段中的空閑數(shù)據(jù)塊的信息就存放在段的頭部并且運用位圖來管理,

20、采用手動管理的本地管理表空間中的段和數(shù)據(jù)字典管理的表空間中的段中的空閑數(shù)據(jù)塊的管理都運用位于段頭部的空閑列表來管理,空閑列表的任務(wù)方式:首先一個空的數(shù)據(jù)塊被參與空閑列表,當(dāng)其中空閑空間小于PCTFREE設(shè)置的值之后,這個塊從空閑列表刪除,當(dāng)這個塊中的內(nèi)容降至PCTUSED設(shè)置的值之下后,這個數(shù)據(jù)塊被再次參與空閑列表,位于空閑列表中的數(shù)據(jù)塊都是可以向其中INSERT的塊,當(dāng)一個塊移出了空閑列表,但只需其中還有保管空間就可以進(jìn)展UPDATE,當(dāng)對其中一行UPDATE一個大數(shù)據(jù)時,假設(shè)當(dāng)前塊不能完全放下整個行,只會把整個行遷移到一個新的數(shù)據(jù)塊,并在原塊位置留下一個指向新塊的指針,這叫行遷移。假設(shè)一個

21、數(shù)據(jù)塊可以INSERT,當(dāng)插入一個當(dāng)前塊裝不下的行時,這個行會溢出到兩個或兩個幾上的塊中,這叫行鏈接。假設(shè)用戶的動作是INSERT 那么效力器進(jìn)程會先鎖定FREELIST,然后找到空閑塊的地址,再釋放FREELIST,當(dāng)多個效力器進(jìn)程同時想要鎖定FREELIST時即發(fā)生FREELIST的爭用,可以在非采用自動段空間管理的表空間中創(chuàng)建表時指定FREELIST的個數(shù),默以為1,假設(shè)是在采用自動段空間管理的表空間中創(chuàng)建表,即使指定了FREELIST也會被忽略,由于此時將運用BITMAP而不是FREELIST來管理段中的空閑空間。假設(shè)用戶動作是UPDATE效力器進(jìn)程將不會運用到FREELIST和BIT

22、MAP,由于不要去尋覓一個空閑塊,而運用鎖的隊列。下面來講一下ORACLE鎖的機(jī)制,ORACLE分鎖存器和鎖兩種。鎖存器是用來維護(hù)對內(nèi)存構(gòu)造的訪問,比如對DB BUFFER中塊的鎖存器懇求,只需在DBWN完成后,這些DB BUFFER塊被解鎖。然后用于其它的懇求。鎖存器不可以在進(jìn)程間共享,鎖存器的懇求要么勝利要么失敗,沒有鎖存器懇求隊列。主要的鎖存器有SHARED POOL鎖存器,LIBRARY CACHE鎖存器,CACHE BUFFERS LRU CHAIN鎖存器,CACHE BUFFERS CHAINS 鎖存器,REDO ALLOCATION 鎖存器,REDO COPY 鎖存器。ORACL

23、E的鎖是用來維護(hù)數(shù)據(jù)訪問的,鎖的限制比鎖存器要更寬松,比如,多個用戶在修正同一表的不同行時,可以共享一個表上的一個鎖,鎖的懇求可以按照被懇求的順序來排隊等候,然后依次運用,這種排隊機(jī)制叫做隊列ENPUEUE,假設(shè)兩個效力器進(jìn)程試圖對同一表的同一行進(jìn)展加鎖,那么都進(jìn)入鎖的懇求隊列,先進(jìn)的加鎖勝利,后面的進(jìn)程要等待,直到前一個進(jìn)程解鎖才可以加鎖,這叫做鎖的爭用,而且一旦加鎖勝利,這個鎖將不斷堅持到用戶發(fā)出COMMIT或ROOLBACK命令為止。假設(shè)兩個用戶鎖定各自的一行并懇求對方鎖定的行的時候?qū)l(fā)生無限期等待即死鎖,死鎖的發(fā)生都是由于鎖的爭用而不是鎖存器的爭用引起的,ORACLE在遇到死鎖時,自動

24、釋放其中一個用戶的鎖并回滾此用戶的改動。正常情況下發(fā)生鎖的爭用時,數(shù)據(jù)的最終保管結(jié)果由SCN來決議哪個進(jìn)程的更改被最終保管。兩個用戶的效力器進(jìn)程在懇求同一表的多個行的鎖的時候是可以交錯進(jìn)入鎖的懇求隊列的。只需其中發(fā)生爭用才會進(jìn)展等待。創(chuàng)建表時指定的MAXTRANS參數(shù)決了,表中的一個數(shù)據(jù)塊最多可以被幾個事務(wù)同時鎖定。下面是幾個關(guān)于回滾段和死鎖的事例:有表:Test (id number(10) 有記錄1000000條一,大SELECT,小UPDATEA會話-Select * from test;-設(shè)scn=101-執(zhí)行時間09:10:11B會話-Update test set id=99999

25、99 where id=1000000-設(shè)scn=102-執(zhí)行時間09:10:12 我們會發(fā)現(xiàn)B會話會在A會話前完成,A會話中顯示的ID=100000是從回滾段中讀取的,由于A會話在讀到ID=1000000所在的BLOCK時發(fā)現(xiàn)BLOCK上有事務(wù)信息,因此要從回滾段中讀,假設(shè)UPDATE在SELECT讀到此BLOCK之前曾經(jīng)COMMIT,那么SELECT 讀到此BLOCK時發(fā)現(xiàn)其BLOCK上沒有事務(wù)信息,但是會發(fā)現(xiàn)其BLICK的SCN比SELECT本人的SCN大,因此也會從回滾段中讀取。因此能否從回滾段讀一是看能否有事務(wù)信息二是比較SCN大小。假設(shè)B會話在A會話終了前延續(xù)多次對同一條記錄UPD

26、ATE并COMMIT,那么在回滾段中將記錄多個“前映像,而每個“前映像中不但包括了原BLOCK的數(shù)據(jù)和SCN也記錄了“前前映像的回滾段地址,因此A會話在查詢到被UPDATE過的BLOCK時,會根據(jù)BLOCK記錄的回滾段的地址,找到回滾段中的“前映像,發(fā)現(xiàn)這個“前映像的SCN也比本人的大,因此將根據(jù)這個“前映像中記錄的“前前映像的回滾段地址,在回滾段中找到“前前映像,再與這個“前前映像比較SCN,假設(shè)比本人小就讀取,假設(shè)還比本人大,那么反復(fù)以上步驟,直到找到比本人SCN小的“前前映像為止,假設(shè)找不到,就會報ORA-01555快照太舊這個錯誤。二、大UPDATE,小SELECTA會話-Update test set id=1;-設(shè)scn=10

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論