oracle事务提交前更新机制,ORACLE事务机制的一些个人理解

一、分析undo segment header bock的结构

##dump undo段头块

SQL> alter system dump undo header '_SYSSMU7_3286610060$';

System altered.

SQL> select * from v$diag_info;

SQL> select * from v$diag_info where name='Default Trace File';

INST_ID NAME VALUE

---------- -------------------- ----------------------------------------------------------------------------------------------------

1 Default Trace File /u01/oracle/diag/rdbms/edus/edus/trace/edus_ora_5131.trc

index state cflags wrap# uel scn dba parent-xid nub stmt_num cmt

------------------------------------------------------------------------------------------------

0x00 9 0x00 0x6eef 0x0007 0x0000.04f8de47 0x00c03dc2 0x0000.000.00000000 0x00000003 0x00000000 1467124072

0x01 9 0x00 0x6efb 0x001c 0x0000.04f8dcd4 0x00c03daf 0x0000.000.00000000 0x00000003 0x00000000 1467123537

0x02 9 0x00 0x6ef7 0x001a 0x0000.04f8de59 0x00000000 0x0000.000.00000000 0x00000000 0x00000000 1467124073

0x03 9 0x00 0x6ef0 0x0018 0x0000.04f8de68 0x00c03dcf 0x0000.000.00000000 0x00000003 0x00000000 1467124073

0x04 9 0x00 0x6f05 0x0020 0x0000.04f8de71 0x00c03dd3 0x0000.000.00000000 0x00000003 0x00000000 1467124073

// 0x05 10 0x80 0x6f03 0x0023 0x0000.04f8d0de 0x00c03dd3 0x0000.000.00000000 0x00000001 0x00000000 0

#猜测state=9,表示已经事务,state=10表示事务未提交

SQL> select to_number('3dd3','XXXXXXXXXXXXX') from dual;

TO_NUMBER('3DD3','XXXXXXXXXXXXX')

---------------------------------

15827 //v$transaction中UBABLK字段值对应

SQL> select to_number('6f03','XXXXXXXXXXXXX') from dual;

TO_NUMBER('6F03','XXXXXXXXXXXXX')

---------------------------------

28419 //v$transaction XIDSLOT字段值对应

二、描述延迟块清除的过程

事务发生时会从回滚段获取一个 ITL(事务槽),分配空间,记录事务相关信息,Transaction 提交后,redo 完成记录,同时还清除回滚段事务信息

包括行级锁,ITL 信息(commit 标志,SCN 等)清除这些事务段的信息的过程就叫做块清除

三、用实验证明DDL操作有两个COMMIT

session1:

SQL> create table ilvtu(id number,name varchar2(30),age number);

Table created.

SQL> select * from ichangxin;

ID NAME

---------- ------------------------------------------------------------

1 yy

1 DX

1 FH

SQL> delete from ichangxin where name='yy';

1 row deleted.

SQL> select * from ichangxin;

ID NAME

---------- ------------------------------------------------------------

1 DX

1 FH

SQL> drop table ilvtu;

Table dropped.

session 2:

#update操作后,drop操作前

SQL> select * from ichangxin;

ID NAME

---------- ------------------------------------------------------------

1 yy

1 DX

1 FH

#drop操作后

SQL> select * from ichangxin;

ID NAME

---------- ------------------------------------------------------------

1 DX

1 FH

四:用一条UPDATE语句把REDO、UNDO、DATA关联起来(通过实验一步步分析)

事务的过程:

1.开始时,去绑定一个回滚段(RBS),回滚段对应一个表,找到undo回滚段的段头(header)那个块里面,找到undo块(涉及到UNDO块的分配)

2.undo回滚段的段头块存放着一张事务表(TX-TABLE),事务表由槽位组成。事务开始时,会分配一个slot

XID=USN+SLOT+SQN

3.slot会有一把锁,包括一些信息,包含undo块指针,指向undo block实际地址

4.执行数据修改,即逻辑操作

5.以上原子操作被记录在redo日志

SQL> select dbms_rowid.rowid_relative_fno(rowid) file#,dbms_rowid.rowid_block_number(rowid) blockid,ichangxin.* from ichangxin;

FILE# BLOCKID ID NAME

---------- ---------- ---------- ------------------------------------------------------------

1 92873 1 YY

1 92873 1 DX

1 92873 1 FH

SQL> alter system switch logfile;

System altered.

SQL> select * from v$log;

GROUP# THREAD# SEQUENCE# BYTES BLOCKSIZE MEMBERS ARCHIV STATUS FIRST_CHANGE# FIRST_TIME NEXT_CHANGE# NEXT_TIME

---------- ---------- ---------- ---------- ---------- ---------- ------ -------------------------------- ------------- ------------ ------------ ------------

4 1 13 209715200 512 1 YES INACTIVE 83409942 27-JUN-16 83409961 27-JUN-16

5 1 14 209715200 512 1 YES ACTIVE 83409961 27-JUN-16 83418585 28-JUN-16

6 1 15 209715200 512 1 NO CURRENT 83418585 28-JUN-16 2.8147E+14

//当前REDO日志组

SQL> select * from v$logfile;

GROUP# STATUS TYPE MEMBER IS_REC

---------- -------------- -------------- -------------------------------------------------- ------

4 ONLINE /u01/oracle/oradata/edus/redo04.log NO

5 ONLINE /u01/oracle/oradata/edus/redo05.log NO

6 ONLINE /u01/oracle/oradata/edus/redo06.log NO

#查看v$transaction视图,注解如下:

XIDUSN:回滚段号为7,对应名称为_SYSSMU7_3286610060$的回滚段

XIDSLOT:第5号事务槽

XIDSQN:事务槽复用序列号

UBAFIL:UNDO块所在文件号为3

UBABLK:所使用UNDO块在3号文件第15827号块

SQL> select XIDUSN,XIDSLOT,XIDSQN,UBAFIL,UBABLK,UBASQN,UBAREC,STATUS from v$transaction;

XIDUSN XIDSLOT XIDSQN UBAFIL UBABLK UBASQN UBAREC STATUS

---------- ---------- ---------- ---------- ---------- ---------- ---------- --------------------------------

7 5 28419 3 15827 575 4 ACTIVE

SQL> select * from v$rollname;

USN NAME

---------- ------------------------------------------------------------

0 SYSTEM

1 _SYSSMU1_3780397527$

2 _SYSSMU2_2232571081$

3 _SYSSMU3_2097677531$

4 _SYSSMU4_1152005954$

5 _SYSSMU5_1527469038$

6 _SYSSMU6_2443381498$

7 _SYSSMU7_3286610060$

8 _SYSSMU8_2012382730$

9 _SYSSMU9_1424341975$

10 _SYSSMU10_3550978943$

11 rows selected.

##dump undo段头块

SQL> alter system dump undo header '_SYSSMU7_3286610060$';

System altered.

SQL> select * from v$diag_info;

SQL> select * from v$diag_info where name='Default Trace File';

INST_ID NAME VALUE

---------- -------------------- ----------------------------------------------------------------------------------------------------

1 Default Trace File /u01/oracle/diag/rdbms/edus/edus/trace/edus_ora_5131.trc

index state cflags wrap# uel scn dba parent-xid nub stmt_num cmt

------------------------------------------------------------------------------------------------

0x00 9 0x00 0x6eef 0x0007 0x0000.04f8de47 0x00c03dc2 0x0000.000.00000000 0x00000003 0x00000000 1467124072

0x01 9 0x00 0x6efb 0x001c 0x0000.04f8dcd4 0x00c03daf 0x0000.000.00000000 0x00000003 0x00000000 1467123537

0x02 9 0x00 0x6ef7 0x001a 0x0000.04f8de59 0x00000000 0x0000.000.00000000 0x00000000 0x00000000 1467124073

0x03 9 0x00 0x6ef0 0x0018 0x0000.04f8de68 0x00c03dcf 0x0000.000.00000000 0x00000003 0x00000000 1467124073

0x04 9 0x00 0x6f05 0x0020 0x0000.04f8de71 0x00c03dd3 0x0000.000.00000000 0x00000003 0x00000000 1467124073

// 0x05 10 0x80 0x6f03 0x0023 0x0000.04f8d0de 0x00c03dd3 0x0000.000.00000000 0x00000001 0x00000000 0

#猜测state=9,表示已经事务,state=10表示事务未提交

SQL> select to_number('3dd3','XXXXXXXXXXXXX') from dual;

TO_NUMBER('3DD3','XXXXXXXXXXXXX')

---------------------------------

15827 //v$transaction中UBABLK字段值对应

SQL> select to_number('6f03','XXXXXXXXXXXXX') from dual;

TO_NUMBER('6F03','XXXXXXXXXXXXX')

---------------------------------

28419 //v$transaction XIDSLOT字段值对应

#DUMP UNDO块

SQL> alter system dump datafile 3 block 15827;

System altered.

SQL> select * from v$diag_info where name='Default Trace File';

INST_ID

----------

NAME

--------------------------------------------------------------------------------

VALUE

--------------------------------------------------------------------------------

1

Default Trace File

/u01/oracle/diag/rdbms/edus/edus/trace/edus_ora_5427.trc

#UNDO块DUMP内容

UNDO BLK:

xid: 0x0007.005.00006f03 seq: 0x23f cnt: 0x4 irb: 0x4 icl: 0x0 flg: 0x0000 //XID三部分内容

Array Update of 1 rows:

tabn: 0 slot: 0(0x0) flag: 0x2c lock: 0 ckix: 0

ncol: 2 nnew: 1 size: 0

KDO Op code: 21 row dependencies Disabled

xtype: XAxtype KDO_KDOM2 flags: 0x00000080 bdba: 0x00416ac9 hdba: 0x00416ac8 //bdba指向记录所在数据块

itli: 2 ispac: 0 maxfr: 4863

vect = 3

col 1: [ 2] 59 59 //更改前的值

SQL> select dump('yy',16) from dual;

DUMP('YY',16)

--------------------------------------

Typ=96 Len=2: 79,79

SQL> select dump('YY',16) from dual;

DUMP('YY',16)

--------------------------------------

Typ=96 Len=2: 59,59

SQL> select object_id from dba_objects where object_name='ICHANGXIN';

OBJECT_ID

----------

91644

#dump redo日志

SQL> alter system dump logfile '/u01/oracle/oradata/edus/redo06.log'

2 ;

System altered.

SQL> select * from v$diag_info where name='Default Trace File';

INST_ID

----------

NAME

--------------------------------------------------------------------------------

VALUE

--------------------------------------------------------------------------------

1

Default Trace File

/u01/oracle/diag/rdbms/edus/edus/trace/edus_ora_5976.trc

CHANGE #1 MEDIA RECOVERY MARKER SCN:0x0000.00000000 SEQ:0 OP:24.4 ENC:0

#更新后的记录

REDO RECORD - Thread:1 RBA: 0x00000f.00000b6b.0010 LEN: 0x0214 VLD: 0x0d

SCN: 0x0000.04f8dee6 SUBSCN: 1 06/28/2016 07:29:05

CHANGE #1 TYP:2 CLS:1 AFN:1 DBA:0x00416ac9 OBJ:91644 SCN:0x0000.04f8bc2d SEQ:2 OP:11.19 ENC:0 RBL:0

KTB Redo

op: 0x11 ver: 0x01

compat bit: 4 (post-11) padding: 1

op: F xid: 0x0007.005.00006f03 uba: 0x00c03dd3.023f.04

Block cleanout record, scn: 0x0000.04f8dee4 ver: 0x01 opt: 0x02, entries follow...

itli: 1 flg: 2 scn: 0x0000.04f8bc2d

Array Update of 1 rows:

tabn: 0 slot: 0(0x0) flag: 0x2c lock: 2 ckix: 0

ncol: 2 nnew: 1 size: 0

KDO Op code: 21 row dependencies Disabled

xtype: XAxtype KDO_KDOM2 flags: 0x00000080 bdba: 0x00416ac9 hdba: 0x00416ac8

itli: 2 ispac: 0 maxfr: 4863

vect = 3

col 1: [ 2] 79 79

CHANGE #2 TYP:0 CLS:29 AFN:3 DBA:0x00c000e0 OBJ:4294967295 SCN:0x0000.04f8de81 SEQ:1 OP:5.2 ENC:0 RBL:0

ktudh redo: slt: 0x0005 sqn: 0x00006f03 flg: 0x0012 siz: 188 fbi: 0

uba: 0x00c03dd3.023f.04 pxid: 0x0000.000.00000000

#UNDO块更改记录

CHANGE #3 TYP:0 CLS:30 AFN:3 DBA:0x00c03dd3 OBJ:4294967295 SCN:0x0000.04f8de7b SEQ:1 OP:5.1 ENC:0 RBL:0

ktudb redo: siz: 188 spc: 7824 flg: 0x0012 seq: 0x023f rec: 0x04

xid: 0x0007.005.00006f03

ktubl redo: slt: 5 rci: 0 opc: 11.1 [objn: 91644 objd: 91644 tsn: 0]

Undo type: Regular undo Begin trans Last buffer split: No

Temp Object: No

Tablespace Undo: No

0x00000000 prev ctl uba: 0x00c03dd3.023f.03

prev ctl max cmt scn: 0x0000.04f8dcc8 prev tx cmt scn: 0x0000.04f8dcca

txn start scn: 0x0000.00000000 logon user: 0 prev brb: 12598697 prev bcl: 0 BuExt idx: 0 flg2: 0

KDO undo record:

KTB Redo

op: 0x04 ver: 0x01

compat bit: 4 (post-11) padding: 1

op: L itl: xid: 0x0001.00f.0000991c uba: 0x00c1866f.0293.1e

flg: C--- lkc: 0 scn: 0x0000.04f85ca8

Array Update of 1 rows:

tabn: 0 slot: 0(0x0) flag: 0x2c lock: 0 ckix: 0

ncol: 2 nnew: 1 size: 0

KDO Op code: 21 row dependencies Disabled

xtype: XAxtype KDO_KDOM2 flags: 0x00000080 bdba: 0x00416ac9 hdba: 0x00416ac8

itli: 2 ispac: 0 maxfr: 4863

vect = 3

col 1: [ 2] 59 59

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值