天天看點

ORACLE 單一事物的操作流程

-- 一個事物的操作流程(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鎖或者說行級鎖實作原理