Oracle事務的完整流程的分析

來源:互聯網
上載者:User

Oracle服務進程如何處理使用者進程的請求
伺服器處理序在完成使用者進程的請求過程中,主要完成如下7個任務:

0.sql語句的解析

1.資料區塊的讀入db buffer

2.記日誌

3.為事務建立復原段

4.本事務修改資料區塊

5.放入dirty list

6.使用者commit或rollback

oracle服務進程如何處理使用者進程的請求
伺服器處理序在完成使用者進程的請求過程中,主要完成如下7個任務:

0.sql語句的解析

1.資料區塊的讀入db buffer(寫入資料緩衝)

2.記日誌

3.為事務建立復原段

4.本事務修改資料區塊

5.放入dirty list

6.使用者commit或rollback

 

0.sql語句的解析

下面要講oracle伺服器處理序如可處理使用者進程的請求,當一使用者進程提交一個sql時:update temp set a=a*2;首先oracle伺服器處理序從使用者進程把資訊接收到後,在PGA中就要此進程分配所需記憶體,儲存相關的資訊,如在會話記憶體儲存相關的登入資訊等;伺服器處理序把這個sql語句的字元轉化為ASCII等效數字碼,接著這個ASCII碼被傳遞給一個HASH函數,並返回一個hash值,然後伺服器處理序將到shared pool中的library cache中去尋找是否存在相同的hash值,如果存在,伺服器處理序將使用這條語句已快取在SHARED POOL的library cache中的已分析過的版本來執行,如果不存在,伺服器處理序將在CGA中,配合UGA內容對sql,進行文法分析,首先檢查文法的正確性,接著對語句中涉及的表,索引,視圖等對象進行解析,並對照資料字典檢查這些對象的名稱以及相關結構,並根據ORACLE選用的最佳化模式以及資料字典中是否存在相應對象的統計資料和是否使用了儲存大綱來產生一個執行計畫或從儲存大綱中選用一個執行計畫,然後再用資料字典核對此使用者對相應對象的執行許可權,最後產生一個編譯代碼。ORACLE將這條sql語句的本身實際文本、HASH值、編譯代碼、與此語名相關聯的任何統計資料和該語句的執行計畫緩衝在SHARED POOL的library cache中。伺服器處理序通過SHARED POOL 鎖存器(shared pool latch)來申請可以向哪些共用PL/SQL區中緩衝這此內容,也就是說被SHARED POOL鎖存器鎖定的PL/SQL區中的塊不可被覆蓋,因為這些塊可能被其它進程所使用。在SQL分析階段將用到LIBRARY CACHE,從資料字典中核對錶、視圖等結構的時候,需要將資料字典從磁碟讀入LIBRARY CACHE,因此,在讀入之前也要使用LIBRARY CACHE鎖存器(library cache pin,library cache lock)來申請用於快取資料字典。

 

到現在為止,這個sql語句已經被編譯成可執行檔代碼了,但還不知道要操作哪些資料,所以伺服器處理序還要為這個sql準備預先處理資料。

 

 

1.資料區塊的讀入db buffer

Oracle處理資料,都需要把資料讀取到記憶體中(即db buffer中),首先伺服器處理序要判斷所需資料是否在db buffer存在,如果存在且可用,則直接擷取該資料,同時根據LRU演算法增加其訪問計數;如果buffer不存在所需資料,則要從資料檔案上讀取。首先伺服器處理序將在表頭部請求TM鎖(保證此事務執行過程其他使用者不能修改表的結構),如果成功加TM鎖,再請求一些行級鎖(TX鎖),如果TM、TX鎖都成功加鎖,那麼才開始從資料檔案讀資料,在讀資料之前,要先為讀取的檔案準備好buffer空間。伺服器處理序需要掃面LRU list尋找free db buffer,掃描的過程中,伺服器處理序會把發現的所有已經被修改過的db buffer註冊到dirty list中,

 

這些dirty buffer會通過dbwr的觸發條件,隨後會被寫出到資料檔案,找到了足夠的空閑buffer,就可以把請求的資料行所在的資料區塊放入到db buffer的空閑地區或者覆蓋已經被擠出LRU list的非髒資料區塊緩衝區,並排列在LRU list的頭部,也就是在資料區塊放入DB BUFFER之前也是要先申請db buffer中的鎖存器,成功加鎖後,才能讀資料到db buffer。

 

2.記日誌

 

現在資料已經被讀入到db buffer了,現在伺服器處理序將該語句所影響的並被讀入db buffer中的這些行資料的rowid及要更新的原值和新值及scn等資訊從PGA逐條的寫入redo log buffer中。在寫入redo log buffer之前也要事先請求redo log buffer的鎖存器,成功加鎖後才開始寫入,當寫入達到redo log buffer大小的三分之一或寫入量達到1M或超過三秒後或發生檢查點時或者dbwr之前發生,都會觸發lgwr進程把redo log buffer的資料寫入磁碟上的redo file檔案中(這個時候會產生log file sync等待事件),已經被寫入redo file的redo log buffer所持有的鎖存器會被釋放,並可被後來的寫入資訊覆蓋,redo log buffer是迴圈使用的。Redo file也是迴圈使用的,當一個redo file 寫滿後,lgwr進程會自動切換到下一redo file(這個時候可能出現log file switch(checkpoint complete)等待事件)。如果是歸檔模式,歸檔進程還要將前一個寫滿的redo file檔案的內容寫到歸檔記錄檔中(這個時候可能出現log file switch(archiving needed))。

 

3.為事務建立復原段

在完成本事務所有相關的redo log buffer之後,伺服器處理序開始改寫這個db buffer的塊頭部事務列表並寫入scn,然後copy包含這個塊的頭部事務列表及scn資訊的資料副本放入復原段中,將這時復原段中的資訊稱為資料區塊的“前映像“,這個”前映像“用於以後的復原、恢複和一致性讀。(復原段可以儲存在專門的復原資料表空間中,這個資料表空間由一個或多個物理檔案組成,並專用於復原資料表空間,復原段也可在其它資料表空間中的資料檔案中開闢。)

 

4.本事務修改資料區塊

準備工作都已經做好了,現在可以改寫db buffer塊的資料內容了,並在塊的頭部寫入復原段的地址。

 

5. 放入dirty list

如果一個行資料多次update而未commit,則在復原段中將會有多個“前映像“,除了第一個”前映像“含有scn資訊外,其他每個“前映像“的頭部都有scn資訊和“前前映像”復原段地址。一個update只對應一個scn,然後伺服器處理序將在dirty list中建立一條指向此db buffer塊的指標(方便dbwr進程可以找到dirty list的db buffer資料區塊並寫入資料檔案中)。

 

接著伺服器處理序會從資料檔案中繼續讀入第二個資料區塊,重複前一資料區塊的動作,資料區塊的讀入、記日誌、建立復原段、修改資料區塊、放入dirty list。當dirty queue的長度達到閥值(一般是25%),伺服器處理序將通知dbwr把髒資料寫出,就是釋放db buffer上的鎖存器,騰出更多的free db buffer。前面一直都是在說明oracle一次讀一個資料區塊,其實oracle可以一次讀入多個資料區塊(db_file_multiblock_read_count來設定一次讀入塊的個數)

 

說明: 

 

 

在前置處理過的資料已經緩衝在db buffer或剛剛被從資料檔案讀入到db buffer中,就要根據sql語句的類型來決定接下來如何操作。

 

1>.  如果是select語句,則要查看db buffer塊的頭部是否有事務,如果有事務,則從復原段中讀取資料;如果沒有事務,則比較select的scn和db buffer塊頭部的scn,如果前者小於後者,仍然要從復原段中讀取資料;如果前者大於後者,說明這是一非髒緩衝,可以直接讀取這個db buffer塊的中內容。

 

2>.  如果是DML操作,則即使在db buffer中找到一個沒有事務,而且SCN比自己小的非髒快取資料塊,伺服器處理序仍然要到表的頭部對這條記錄申請加鎖,加鎖成功才能進行後續動作,如果不成功,則要等待前面的進程解鎖後才能進行動作(這個時候阻塞是tx鎖阻塞)。 

 

6.使用者commit或rollback 

 

到現在為止,資料已經在db buffer或資料檔案中修改完成,但是否要永久寫到數檔案中,要由使用者來決定commit(儲存更改到資料檔案)和rollback(撤銷資料的更改),下面來看看在commit和rollback時,oracle都在做什麼。

  • 1
  • 2
  • 下一頁

相關文章

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.