--DML 更新數據操作:
1.創建一個改變向量(保存改變之前的數據)描述undo數據塊的改變;
2.創建改變向量(保存改變之後的數據),描述數據塊的改變;
3.合並兩個改變向量為日志記錄,寫入日志緩沖區
4.創建undo記錄插入undo表空間;
5. 改變數據塊的數據;
所以任務報告為:
--任務報告
1. 創建undo塊(數據文件2)的改變向量(方法為記錄undo記錄的內容)
2. 創建table數據塊的改變向量
3a 合並兩個改變向量,創建改變記錄
3b 將改變記錄復制到日志緩沖區
4 應用undo塊改變向量(undo記錄的redo change vector,創建undo記錄)
5 應用table塊改變向量
所有會話進程向同一個日志緩沖區復制改變向量。
引入redo allocation latch: 用戶進程嘗試請求redo latch來在日志緩沖區保留部分空間;
存在問題:大量進程爭用redo allocation latch, 消耗CPU資源,’自旋’ CPU的進程循環爭用redo latch;
概況為一個進程的每一次變更,一條記錄,一次log buffer 內存分配
--priate redo log buffer
Oracle 10g引入的。
每個進程有私有的日志緩沖區,一個事務中每次變更都寫入這個進程的私有的日志緩沖區中;讓事務提交後,這個進程獲取一此公共的log buffer即可。
私用用redo allocation latch 保護,公共的用redo copy latch保護;
--IMU:In-Memory-Undo
Oracle 10g引入。
每個進程的私有日志緩沖區的一部分。進程將undo 重做日志寫入IMU;
IMU 采用IMU latch來保護。最後IMU的記錄和priavate redo log buffer日志記錄合並。寫入公共的redo log buffer;
--DML 更新數據操作:
1. 創建一個改變向量描述undo數據塊的改變;
2. 創建改變向量,描述數據塊的改變;
3 undo改變向量存入IMU日志緩沖區
Table改變向量存儲private log buffer
6. 將IMU 記錄和Pirvate log buffer記錄合並成一條改變記錄,結束事務
7.講重做改變記錄復制到日志緩沖區,並改變這個塊。
--IMU
IMU池有lacth保護,池個數=transation/10
當124KB空間使用滿了,回退到oracle9i的機制
--oracle數據塊的存儲信息
Tab 0 row 4 @0x1d3f
//表示第一個塊,記錄5,實際的存儲地址為@0x1d3f
Col 0:[2] c1 0a
//第一列,為兩個字符的空間,內容為c10a;
Lb: 0x2
//鎖信息
Kdo op code: urp row
//更新行片
Hdba: ox**** bdba:ox****
//hdba段頭塊的地址(段地址)
bdba: 塊地址
Itli:2
//目前事務使用第二個事務槽
Tabn0 slot 4
//表示更新第一張表,第五行數據
Ncol: 4 nnew:1 size:4
//要更新的記錄有4列,更細其中1列,長度增加4;
Col 2 [10 ] 59 59 ….
//更細的為第二列,增加之後長度為10個字符
不同於數據庫改變向量之處
Ncol: 4 nnew:1 size:-4
//undo的時候,長度減少4
Col 2 [6] 78 78..
//原始數據第二行為 6個字符
--undo塊的重做改變向量,描述undo記錄的重做改變向量,所以和undo記錄的最終值相同。
Dba(數據塊地址):ox00..
//undo表空間為數據文件2
記錄和undo的記錄一樣;
1原子性:a進程處理一個事務的中間(改變表1行4的數據),
B 進程訪問(表1行4):通過undo記錄來訪問舊數據。
2 一致性:進程看到的數據為:老狀態,新狀態,沒有中間狀態
3 隔離性(獨立性):
默認為:提交讀;
如a進程,B進程同時修改同一個數據塊。
4 持續性:待續;
--改變記錄頭:change recode header
Op:11.5 表示table redo改變向量
Op:5.2 表示事務的開始,
OP:5.1 表示undo改變向量
OP:5.4 事務結束
--讀一致性
(1)數據塊需要包含指向undo記錄的指針。事務a更新數據,事務b根據指針讀取undo記錄的原始數據。
(2)事務a1更新一行數據,事務a2更新另外一行數據,則產生兩條undo記錄,所以數據塊(比如包含一個表)要包含2個undo記錄的指針,才能保證事務b查詢整個表的結果為正常。
(3)oracle在每個數據塊內部只允許存放有限的指針(每個隊員一個改變塊的事務),ITL entries位置
(4)如果事務a對於數據塊(一張表)做了兩次更新:事務b根據ITL表的entry2找到undo記錄2,對事務b隱藏了事務a更新2操作。Undo記錄2裡面有指針指向ITL表entry1的指針;事務b通過undo記錄2 找到 ITL entry1 , 通過ITL entry1 找到undo記錄1;
這個事務b讀的表的數據,就屏蔽了事務a對於兩行的更改;
(5)事務b的內存中生成表的拷貝,然後將事務a的兩個undo記錄復制應用到拷貝上。
(5)讀一致性,針對一個表及這個表的所有undo記錄的指針鏈表
--回滾
(1)回滾是一個事務的歷史,需要一個事務所有undo記錄的正確排序的指針鏈表(比如對一行的一列,進行兩次操作,產生兩台Undo記錄);
(2)回滾和讀一致性的區別:讀一致性的是讀內存的數據緩存,讀完之後,迅速捨棄。
回滾是獲得當前數據塊,並且應用undo記錄來還原
當前塊,表示要寫入到磁盤上的版本;
因為是當前塊,所有改變要產生redo;
(3)如果undo記錄已經被回滾使用,則undo有個標記 user undo applied標記;