开篇我们先用一个实验引出事务:
sys@ORCL> select xid,xidusn,xidslot,xidsqn,ubablk,ubafil from v$transaction;
no rows selected
没找到相应的事务信息,用hr发起一条事务:
hr@ORCL> select * from p;
ID TEST
---------- -----
2 f
3 g
1 a
hr@ORCL> update p set test='w' where id=1;
1 row updated.
再次查看事务信息:
sys@ORCL> /
XID XIDUSN XIDSLOT XIDSQN UBABLK UBAFIL
---------------- ---------- ---------- ---------- ---------- ----------
02000800E2010000 2 8 482 3339 2
查看hr发起事务所对应的回滚段:
sys@ORCL> select xidusn,sid,username from v$transaction t,v$session s where t.ses_addr=s.saddr;
XIDUSN SID USERNAME
---------- ---------- ------------------------------
2 141 HR
9 158 SCOTT
查看2号回滚段的段名:
sys@ORCL> select * from v$rollname;
USN NAME
---------- ------------------------------
0 SYSTEM
1 _SYSSMU1$
2 _SYSSMU2$
3 _SYSSMU3$
4 _SYSSMU4$
5 _SYSSMU5$
6 _SYSSMU6$
7 _SYSSMU7$
8 _SYSSMU8$
9 _SYSSMU9$
10 _SYSSMU10$
11 rows selected.
然后把2号回滚段的段头dump出来,到udump目录下去找:
sys@ORCL> select header_block,header_file from dba_segments where segment_name='_SYSSMU2$';
HEADER_BLOCK HEADER_FILE
------------ -----------
41 2
sys@ORCL> alter system dump undo header '_SYSSMU2$';
System altered.
查看当前会话的server process的进程编号:
sys@ORCL> select spid from v$process where addr in (select paddr from v$session where sid=(select sid from v$mystat where rownum=1));
SPID
------------
5446
2号undo段头部dump出来的部分内容如下:
Version: 0x01
FREE BLOCK POOL::
uba: 0x00800017.027b.0b ext: 0x2 spc: 0x19d8
uba: 0x00000000.027b.02 ext: 0x2 spc: 0x1f06
uba: 0x00000000.0278.1f ext: 0x10 spc: 0xf54
uba: 0x00000000.0000.00 ext: 0x0 spc: 0x0
uba: 0x00000000.0000.00 ext: 0x0 spc: 0x0
TRN TBL::
index state cflags wrap# uel scn dba parent-xid nub stmt_num cmt
------------------------------------------------------------------------------------------------
0x00 9 0x00 0x01e8 0x001d 0x0000.0014d967 0x00800016 0x0000.000.00000000 0x00000001 0x00000000 1343716115
0x01 9 0x00 0x01e9 0x002d 0x0000.0014db8f 0x00800017 0x0000.000.00000000 0x00000001 0x00000000 1343717092
0x02 9 0x00 0x01e8 0x0009 0x0000.0014d4b9 0x00800012 0x0000.000.00000000 0x00000001 0x00000000 13437138
这里面有个很重要的概念叫:xid
xid是事务的编号,也是地址,它由三部分组成:
1)使用哪个undo segment header(块号)
2)使用undo segment header里面的事务表的哪一行(行号)
3)是第几次被覆盖(覆盖的次数)
一个事务开始时,会在两个位置,做两件事:
a)在相对空闲的回滚段的段头的事务表(最多47行)标注事务信息,其中包括了xid,uba;并且分配回滚块
b)把要修改的数据块的块头的事务槽(最多255个槽位)上标注事务信息,其中包含了xid,uba
整个过程有四个地方发生了变化:undo segment header,回滚块,数据块的块头,数据块。这四个地方的变化都得到了redo的保护。
分享到:
相关推荐
专题之Undo工作原理剖析 相当专业的深入剖析 关于oracle 10g中Undo表空间的原理解析 值得看下
资源名称:Oracle 11g体系结构深入剖析和运维管理(五)资源目录:【】37_深入剖析事务槽及Oracle多种提交方式【】38_OracleIMU及RedoPrivateStrands技术【】39_读一致性(ORA-01555错误机制分析)及Undo表空间大小设置...
资源名称:Oracle 11g体系结构深入剖析和运维管理(四)资源目录:【】28_存储结构_段区块【】29_检查点队列(checkpointqueue)【】30_实例崩溃恢复原理剖析【】31_系统改变号(SCN)详解【】32_事务概述【】33_事务ACID...
UNDO表空间用来存放改变前的旧值。... ORACLE开始一个事务的时候,会用到表空间。将修改前的数据保存在UNDO段里。 Undo的三个作用 读的一致性,构造CR块 回滚 实例恢复(时的回滚) --查询UNDO表空间的名字 -----
Undo
oracle版本的undolog建表语句。 2019 年 1 月,阿里巴巴中间件团队发起了开源项目 Fescar(Fast & EaSy Commit And Rollback),和社区一起共建开源分布式事务解决方案。Fescar 的愿景是让分布式事务的使用像本地...
图形学的几个基本画线,画矩形等的程序 几个MFC画图程序(实现了undo+redo功能)
Delphi 中实现Redo Undo的一个简单实例,包含源码
这个是做实验时,简单基本的Undo、Redo的操作、在一个winForm中实现,并且可以设置Undo的最大次数。包中除了项目外,还附有报告.
在修改操作中,对于回退段的操作存在多处,在事务开始时,首先需要在回滚段表空间获得一个事务槽,分配空间,然后创建前镜像,此后事务的修改才能进行,Oracle必须以此来保证事务是可以回退的。
今年实习刚刚做的MFC画图程序(实现了undo redo功能),发上来互相学习下。
redo undo framework source code redo undo framework source code
实现redo,undo操作,来源于网络分享下。
undo 表空间利用率 处理 事务 回滚等介绍 以及如何切换undo表空间
行业-45 如果事务执行到一半要回滚怎么办?再探undo log回滚日志原理!l.rar
本文用图形化直观的方式形像的描述出ORACLE UNDO段里的事务槽、SCN号、事务控制、事务锁的真正原理。将深奥难懂的锁、事务、一致性形像的展示出来。本文还借供了大量的查询、优化UNDO段相关的SQL语句。非常有价值一...
介绍12c新特性Temporary Undo
比较深入浅出的描述了基于oracle10g/11g的UNDO表空间的管理
Undo_Redo机制在CAD中的应用, 摘要:为了增强CAD系统的灵活性,提高设计的效率,本文引入设计模式概念,通过对数据对象的持久化.设计出一套支 持无限Undo/Redo和批量化操作的CAD图形绘制系统,文章介绍了各模块的...
c# undo/redo例子 支持文字的样式,颜色修改 动态进度条