ORACLE ITL事務槽

講到ITL(事務槽)一定先說數據塊,那麼什麼是數據塊呢?先給你們上一個數據塊結構圖html

數據塊分別由塊頭、ITL(事務槽)、表信息區、行信息區、塊空閒區、行數據區組成,其中ITL用來記錄在數據塊發生的全部業務,簡單通俗的講你在數據庫對一張表進行操做,都會記錄在數據塊中,表與數據塊是一一對應的關係。數據庫

在行數據區是從下到上執行的,當執行DML語句時候,行數據區會在下方創建一個新的數據區,事務提交的時候,原先的數據會被unused。而後新數據塊替換舊數據塊。oracle

ITL(Interested Transaction List)是Oracle數據塊內部的一個組成部分,位於數據塊頭(block header),itl由xid,uba,flag,lck和scn/fsc組成,用來記錄該塊全部發生的事務,一個itl能夠看做是一條事務記錄。固然,若是這個事務已經提交,那麼這個itl的位置就能夠被反覆使用了,由於itl相似記錄,因此,有的時候也叫itl槽位。若是一個事務一直沒有提交,那麼,這個事務將一直佔用一個itl槽位,itl裏面記錄了事務信息,回滾段的入口,事務類型等等。若是這個事務已經提交,那麼,itl槽位中還保存的有這個事務提交時候的SCN號。

spa

如需看具體的ITL文件信息,定位到udump文件進行查看數據塊頭文件的變化。.net

ITL知識點對於一個初學dba只要記住兩點。rest

1、ITL重用後如何實現前ITL讀一致性htm

 

   ORACLE經過ITL條目中記錄的回滾段地址找到回滾段,實現讀一致性,若是事務已提交,ITL就能夠被重用,可是若前一個ITL被重用,前一個ITL的讀一致性是如何實現的呢?

     假定block只有一個itl,假定第一個事務的時候產生了 ITL-0

     第二個事務來了,產生了 ITL-1 ,ITL-1 裏面的UBA 能夠找到回滾段地址,回滾段中除了記錄了 block用戶數據的 before image 外還記錄了  ITL-0 的信息。

     第三個事務來了,產生了 ITL-2  , ITL-2 中 UBA 指向回滾段,回滾段中 也記錄了 ITL-1 的信息。

     這樣當一個查詢若須要ITL-0時候的信息,則找到當前block,發現是 ITL-2 ,根據UBA找到回滾段進行 roll 獲得  變化前 block ,這個時候發現block中是 ITL-1 . 還不能知足需求。 因而再根據 ITL-1 中的 UBA 又去回滾段中找到數據來進行roll,獲得一個block 數據,這個時候block中就有了 ITL-0。

     經過根據當前ITL進行遞歸的方式找到數據,實現以前ITL的獨一致性。
2、行鎖原理blog

Oracle的鎖機制是一種輕量級的鎖定機制,不是經過構建鎖列表來進行數據的鎖定管理,而是直接將鎖做爲數據塊的屬性,存儲在數據塊首部。這個是經過ITL來實現的,一個事務要修改塊中的數據,必須得到該塊中的一個itl(經過initrans預先分配的或者是經過free space構建的)。經過itl和undo segment header中的transaction table,能夠知道事務處於活動階段,仍是已經完成。事務在修改塊時(其實就是在修改行)會檢查行中row header中的標誌位,若是該標誌位爲0(該行沒有被活動的事務鎖住,這是可能要進行deferred block cleanout等工做),就把該標誌位修改成事務在該塊得到的itl的序號,這樣當前事務就得到了對記錄的鎖定,而後就能夠修改行數據了,這也就是oracle行鎖實現的原理。

遞歸

瞭解更多鎖知識點:http://www.javashuo.com/article/p-ehbvlcpq-gg.html事務

參考資料:https://blog.csdn.net/gyb2013/article/details/6893639

     http://www.javashuo.com/article/p-hsoohxah-cn.html

相關文章
相關標籤/搜索