理解UND0 2 事務

2021-07-28 00:21:08 字數 3138 閱讀 8623

我們從上篇 理解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來運算元據庫,必須通過以下步驟才能使用到資料庫的事務,步驟如下...