oracle itl(事務槽)的理解
一、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,在回滾段事務表中有一條記錄和這個事務對應
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 :
對oracle ITL 事務槽 的理解
對oracle itl 事務槽 的理解 一 itl描述 itl interested transaction list 是oracle資料塊內部的乙個組成部分,位於資料塊頭 block header itl由xid,uba,flag,lck和scn fsc組成,用來記錄該塊所有發生的事務,乙個itl...
iOS FMDB 事務的理解
queue intransaction fmdatabase db,bool rollback etc db executeupdate insert into mytable values nsnumber numberwithint 4 最簡單的例子來說明事務 a賬戶向b賬號匯錢 來說明事務 1...
對事務的理解
事務 transaction 是訪問並可能更新資料庫中各種資料項的乙個程式執行單元.事務的四個屬性 原子性atomicity 乙個事務是乙個不可分割的工作單位,事務中包括的諸操作要麼都做,要麼都不做.一致性consistency 事務必須是使資料庫從乙個一致性狀態到另乙個一致性狀態.一致性與原子性是...