我們從上篇 理解undo-1
當中了解到 事務必須先到undo表空間裡搞定個事務id 才能開始幹活.
拿到了事務id編號,同時拿到了一塊undo塊來保留舊資料,就可以向目標資料塊itl槽申請位置. 這樣我們有一些對像來協調工作了.它們就是
1 undo 段塊中的事務表
2 undo 塊裡面,舊資料記錄
3 資料塊 上面的itl
4 資料塊的 row
先看第乙個,段頭塊回顧圖
事務表的段資訊如下
index:標識事務表中的行
state:表示事務狀態 9代表非活躍,10代表活躍;
cflags:表示事務狀態:0x0無事務;0x10死事務;0x80活動事務;0x90回滾事務;
wrap#:事務槽使用次數
uel:當事務活動時,指向下個可用的事務槽(不重要)
scn:事務開始scn,或者提交scn
dba: 事務最後使用的undo塊位址
nub:使用多少個undo塊
cmt:提交時間(不重要)
從這些字段可以大概了解下,有些什麼功能,無非是為了回滾準備著. scn+dba+nub 這三個欄位就能獲得回滾開始地方和結束的地方.
事務拿到事務xid後,這個xid前面說過由undo段號,+index,+wrap# 這三個組成.
事務拿到了xid後, 它執行個update table set name=』zfk』 where id=9;這樣的工作, 假如這語句 要更新10筆記錄,當這10筆記錄分布在5個塊中,假設每個塊,這裡是指資料塊,包含15筆記錄.目標10筆記錄很均勻分布下去,其中有兩筆需要更新的.
事務不是一口氣把5個塊一起修改的,雖然做為人類看是這樣的,實際上它先要拿到第乙個資料塊來修改,修改好了,依次逐漸去修改其他塊中的資料.然後整體提交.
那我們看第三個物件 資料塊
下面是資料塊的邏輯圖
資料塊資訊
這個圖有三部分構成
1 是itl 事務槽
2 是行記錄
3 行結構和資料
當事務拿到了事務xid,就要向資料塊上的itl申請,申請到了就把xid放進對應的位置上.
資料塊的itl欄位資訊
itl:事務槽號;
xid:事務id;
uba: undo塊裡面的undo記錄位址
flag:事務當前狀態 —-活動;u 快速提交; c 提交並清除;b t 不重要狀態;
lck 鎖定行數
scn/fsc scn 提交的scn; fsc 空閒空間審計(不重要)
2 行記錄 當中的 pri[0] offset=0x1f85 表示行號和偏移量, 這些值可以在下面的行結構和值中找到
1 行結構和資料
tab 0 ,row 2,@0x1f85
tl:9, fb:–h-fl– ib:0x1 cc:2
col 0: [2] c1 04
col 1: [2] c1 64
其中 row 2 @0x1f85 對應行記錄中的資料; col 0 表示第乙個字段 [2] 表示該欄位實際長度; 後面的 c1 04 表示實際的資料.
最重要的是 lb:0x1 表示指向資料塊中的事務槽號.
當事務申請到了事務槽號後,通過行記錄(目錄)(索引項) 找到了目標行,更改lb指標,指向自己的事務槽號.
然後把行當中的某列的值和當前事務槽原來的事務資訊. 因為事務槽也會被重用,一起打包保留到undo塊中.
最後該輪到主角上場啦!! 壓軸戲 先看邏輯圖
它同樣有三個區域
1控制區
2 記錄索引區
3 記錄區
下面是塊的內容: 重點不是要看懂
第一部分 控制區 undo blk:
第二部分: rec offset
第三部分: *———————————
第一部分 xid 就知道該塊歸哪個事務擁有
第二部分 講的是undo記錄和偏移量
第三部分才是重點 又細分三個部分
第1小部分 從— 到—– 算主要是講事務槽和上個記錄
stl 表示該記錄是哪個undo事務槽號的. 這跟資料塊中的行指標 lb 一樣的.
opc 表示操作型別
rci 表示上個記錄的本塊行號
rdba 表示 上個記錄的undo塊位址 外加 irb資訊
第2小部分 從*—- 到col 這裡主要記錄數塊中的itl資訊
itli:資料塊事務槽號
uba:資料塊事務槽號中的uba
第3小部分 就是剩下的 col 舊資料啦
這樣我們就把舊資料安全儲存在undo塊中了.
假設我們已經把5個塊,10個目標行修改完後,發出commit命令,這個事務就結束了.那麼這5個塊上的事務標誌flags 都表示c; 另外有個情況是前3個快被dbwr寫入了磁碟,為了效能,不能從磁碟再讀取出來,做個事務清除工作.留到日後別的事務或者是查詢再讀取的時候,順便做一下.
假如 我們修改了前3個塊,人工發出rollback,或者斷電進行實列恢復,或者回話被kill掉了. 我們就要撤銷該事務的更新,也就是做回滾操作.
回滾操作:
1 通過undo段頭上的事務表資訊,找到死的事務
2 找到該事務的最後乙個塊dba欄位 undo 記錄 跟 資料塊uba一樣.
3 到了undo塊裡,讀取該記錄 恢復 記錄當中的舊資料和舊的itl資訊到資料塊中
4 然後讀取undo記錄當中的 rci rdba irb等指標資訊 找到事務上一條undo記錄.
這樣就完成了回滾鏈條 可以想象 這是個反向更新操作, 同樣資源的消耗,修改資料塊,寫日誌.
讀一致性:
1 找到目標行,發現行中的ib 指向的itl 中的scn 比自己的大
2 把當前塊複製到記憶體其他區域中
3 對所有提交的事務做清除工,反向更改未提交的事務. (其實就是做塊恢復操作)
4 通過行指標指向的itl中的uba 找到undo塊中的記錄資訊
5 把undo塊中的記錄 舊資料和舊的itl還原回來
6 再對比還原回來的舊itl中的scn,還大的話 繼續讀取uba的指標,又去讀undo塊中的記錄.重複迴圈,直到恢復所需要的scn跟自己一樣的
這樣就恢復乙個獨特的資料塊出來,屬於該回話私有的. 這就是cr塊!
這樣 undo塊中的舊記錄 通過兩個指標完成 回滾和讀一致性!
事務理解筆記
required 預設值 在有transaction狀態下執行 如當前沒有transaction,則建立新的transaction supports 如當前有transaction,則在transaction狀態下執行 如果當前沒有transaction,在無transaction狀態下執行 man...
spring事務理解
由於以前都是對整個selevlet或者jsp進行事務,所以昨天自然的也以為可在controller類中進行事務 在handlerequest方法中使用了 code jzlogic.updatea a jzlogic.inserb b code jzlogic已經設定事務規則,對insert upda...
Spring 事務理解
1 spring事物是什麼?事務通常由高階資料庫操縱語言或程式語言編寫的,說白了事務就是執行一段或者多段sql的方法。spring本身是沒有事務一說的,資料庫對事務的支援才是spring事務的本質。2 為什麼需要spring事物?jdbc來運算元據庫,必須通過以下步驟才能使用到資料庫的事務,步驟如下...