-- 一個事物的操作流程(undo的作用)
-- undo段的組成:段頭、復原塊
-- 事務id
select xid,xidusn,xidslot,xidsqn,ubablk,ubafil from v$transaction;
xid -- 事物id
xidusn -- 復原段編号 -- 對應 v$rollname 查詢
xidslot -- 事物表的行号
xidsqn -- 覆寫次數
ubablk -- 復原塊号
ubafil -- 回歸段對應檔案号
xid = xidusn +xidslot +xidsqn
uba= ubafil +ubablk
-- 事務表(undo段頭塊中)
-- undo段的第一個資料塊,每一個復原段最多可以47個事務
-- 檢視復原段段頭塊位址
select * from v$rollname;
select header_block,header_file from dba_segments where segment_name='_syssmu1_812862839$';
alter system dump undo header '_syssmu1_812862839$'; -- 轉儲復原段頭
alter system dump datafile 5 block 4308; -- 轉儲一個復原段資料塊
-- 事務槽(塊中):xid、uba(復原快位址)
-- xid組成:
①undo段頭的塊号
②事物表的行号
③覆寫次數 這樣通過xid就可以唯一确定哪個事物表中的哪行資訊
-- 一個事物開始後會分别在事物表和事物槽中記錄事物資訊(xid等)
-- 事務表:一個事務開始,在undo表空間找一個相對空閑的復原段,把事務資訊(xid,uba等)寫到undo段頭塊的事務表中,然後在undo段中找一個undo塊來寫修改前的鏡像,讓uba指向這個undo塊。
-- 事務槽:然後去找對應要修改的塊,在塊頭部的事務槽中找一行(事務槽中有多行可以記錄多個事物),把事務資訊(xin,uba等)寫進去,然後就可以修改資料了,把老資料寫到uba對應的undo塊中,然後修改資料。
-- 一個事務可以修改多個塊,多個塊的undo資訊可以存在一個undo塊中,直到這個undo塊被寫滿。
-- cmmmit時候會把事物表和事物槽的flg标志置為c
-- oracle為了快速送出,會把事物表中的flg标志置為c,而事物槽中的flg和行頭指向(鎖定标記)不一定更新,待下次有事物需要檢視塊裡對應行
-- 是否已經送出的時候,找該行的事物槽,如果flg是c,直接可以修改該行并且行頭指向這個新事物槽。
-- 行頭指向一般commit時候最不愛清空,下次查詢的時候打斷
-- 如果flg不是c,再去現在所指向的事物槽找xid,根據xid找到對應的事物表,就能确定該事物是否已經送出,如果确實是c則更新事物槽的flg、行頭指向新的事物槽!
-- 最徹底的commit是把事物表中的flg标志(必修改)、事物槽中的flg(可能修改)、行頭指向置空(不愛修改)都修改。
-- 其實這個行頭指向事物槽就是大家常說的tx鎖或者說行級鎖實作原理