oracle ITL(事務槽)的理解

來源:互聯網
上載者:User

標籤:blog   http   使用   strong   檔案   資料   io   art   

一、ITL描述:

ITL(Interested Transaction List)是Oracle資料區塊內部的一個組成部分,位於資料區塊頭(block header),itl由xid,uba,flag,lck和scn/fsc組成,用來記錄該塊所有發生的事務,一個itl可以看作是一條事務記錄。當然,如果這個事務已經提交,那麼這個itl的位置就可以被反覆使用了,因為itl類似記錄,所以,有的時候也叫itl槽位。如果一個事務一直沒有提交,那麼,這個事務將一直佔用一個itl槽位,itl裡面記錄了事務資訊,復原段的入口,事務類型等等。如果這個事務已經提交,那麼,itl槽位中還儲存的有這個事務提交時候的SCN號。

ITL個數其最小值為1,由參數initrans控制(由於相容性的原因,oracle會在對象的儲存塊分配兩個itl,所以initrans的最小值實際上為2),最大值為255,由參數maxtrans控制,最大值參數在10g以後不能被修改,itl是block級的概念,一個itl佔用塊46B的空間,參數initrans意味著塊中除去block header外一部分儲存空間無法被記錄使用(46B*initrans),當塊中還有一定的free space時,oracle可以使用free space構建itl供事務使用,如果沒有了free space,那麼,這個塊因為不能分配新的itl,所以就可能發生itl等待。
如果在並發量特別大的系統中,最好分配足夠的itl個數,其實它並浪費不了太多的空間,或者,設定足夠的pctfree,保證itl能擴充,但是pctfree有可能是被行資料給消耗掉的,如update,所以,也有可能導致塊內部的空間不夠而導致itl等待。

dump一個塊可以看到ITL資訊類似如下:
     Itl           Xid                                    Uba                             Flag      Lck        Scn/Fsc
    0x01   0x0006.002.0000158e  0x0080104d.00a1.6e   --U-   734    fsc 0x0000.6c9deff0
    0x02   0x0000.000.00000000  0x00000000.0000.00  ----        0       fsc 0x0000.00000000
 

Xid:事務id,在復原段事務表中有一條記錄和這個事務對應

Uba:復原段地址,該事務對應的復原段地址

  第一段地址:復原資料區塊的地址,包括復原段檔案號和資料區塊號

  第二段地址:復原序號

  第三段地址:復原記錄號

  SELECT UBAFIL 復原段檔案號,UBABLK 資料區塊號,UBASQN 復原序號,UBAREC 復原記錄號 FROM v$transaction --查看UBA

Flag:事務標誌位。這個標誌位就記錄了這個事務的操作,各個標誌的含義分別是:

----- = 事務是活動的,或者在塊清除前提交事務

C--- = 事務已經提交並且清除了行鎖定。

-B-- = this undo record contains the undo for this ITL entry

--U- = 事務已經提交(SCN已經是最大值),但是鎖定還沒有清除(快速清除)。

---T =當塊清除的SCN被記錄時,該事務仍然是活動的,塊上如果有已經提交的事務,那麼在clean ount的時候,塊會被進行清除,但是這個塊裡面的事務不會被清除。

Lck:影響的記錄數

Scn/Fsc:快速提交(Fast Commit Fsc)的SCN或者Commit SCN。

每條記錄中的行級鎖對應於Itl列表中的序號,即哪個事務在該記錄上產生的鎖。

  

 二、ITL等待

      發生等待的情境:

     1.超過maxtrans配置的最大ITL數

      2.initrans不足,沒有足夠的free space來擴充ITL

      解決方案:

      1.maxtrans不足:這一情況是由高並發引起的:同一資料區塊上的事務量已經超出了其實際允許的ITL數。因此,要解決這類問題就需要從應用著手,減少事務的並發量;長事務,在保證資料完整性的前提下,增加commit的頻率,修改為短事務,減少資源佔用事件。而對於OLAP系統來說(例如,其存在高並發量的資料錄入模組),可以考慮增大資料區塊大小。

      2.initrans不足:資料區塊上的ITL數量並沒有達到MAX TRANS的限制,發生這種情況的表通常會被經常UPDATE,從而造成預留空間(PCTFREE)被填滿。如果我們發現這類ITL等待對系統已經造成影響,可以通過增加表的INITRANS或者PCTFREE來解決(視該表上的並發事務量而定,通常,如果並發量高,建議優先增加INITRANS,反之,則優先考慮增加PCTFREE)。

  要注意的一點是,如果是使用ALTER TABLE的方式修改這2個參數的話,只會影響新的資料區塊,而不會改變已有資料的資料區塊——要做的這一點,需要將資料匯出/匯入、重建表。

 

ITL重用後如何?前ITL讀一致性

     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的獨一致性。

行鎖原理:

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

zhuanzai :http://blog.csdn.net/gyb2013/article/details/6893639

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

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.