ITL(Interested Transaction List)
ITL(Interested Transaction List)是Oracle資料塊內部的一個組成部分, 位於資料塊頭(block header),itl由xid(Transaction XID),uba(Undo block address),flag,lck和scn/fsc組成,
用來記錄該塊所有發生的事務,一個itl可以看作是一條事務記錄。 當然,如果這個事務已經提交,那麼這個itl的位置就可以被反覆使用了,因為itl類似記錄,所以,有的時候也叫itl槽位。如果一個事務一直沒有提交, 那麼,這個事務將一直佔用一個itl槽位,itl裡面記錄了事務資訊,回滾段的入口, 事務型別等等。如果這個事務已經提交, 那麼,itl槽位中還儲存的有這個事務提交時候的SCN號。 [@more@]
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的獨一致性。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/14377/viewspace-1060111/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle ITL (Interested Transaction List) - 事務槽OracleREST
- 什麼是Interested Transaction List(ITL)--Oracle?RESTOracle
- zt_Orace ITL(Interested Transaction List) 說明REST
- SAP Retail Transaction ListAI
- SAP SD Transaction codes List
- ITL
- oracle ITL槽Oracle
- 深入研究ITL阻塞與ITL死鎖 作者 piner
- 遭遇ITL死鎖
- ITL的含義
- zt_ITL Cleanout和ITL中的事務狀態分析
- 推薦:深入研究ITL阻塞與ITL死鎖(轉載)
- 表的itl 屬性
- Activity Transaction
- oracle set transaction read only與dbms_transaction實現事務transaction控制Oracle
- ITL與事務處理
- enq: TX - allocate ITL entryENQ
- TX:ITL LOCK(INITRANS,MAXINTRANS)
- Transaction簡介
- Database Transaction ProblemDatabase
- ITL和Freelist的區別
- oracle ITL TX MODE 4問題Oracle
- ITL事務槽記載-01
- 從Dump資料塊看ITL
- IDBObjectStore.transactionObject
- IDBDatabase.transaction()Database
- indexedDB transaction 事務Index
- Transaction註解原理
- Boost UDP Transaction PerformanceUDPORM
- ITL:泰國移動電商的新模式模式
- oracle block資料塊itl小記OracleBloC
- Django處理事務:transactionDjango
- SAP EWM Transaction Codes
- Check the transaction running in oracleOracle
- SMON: Parallel transaction recovery triedParallel
- The sence about Transaction in SpringSpring
- 關於oracle autonomous transactionOracle
- Important Transaction Codes For BWImport