[20130312]undo与select for update.txt

[20130312]undo与select for update.txt

闲着没事,研究一下undo与select for update.

DML操作在UNDO中的信息

通过Dump UNDO Block观察到DML操作记录在UNDO中的信息,主要为以下内容:
1、对于Insert操作,需要在UNDO中记录插入行的ROWID.
2、对于Update操作,需要在UNDO中记录被更新列的前镜像的值,同时也会记录被更新行的ROWID。
3、对于Delete操作,需要在UNDO中记录被删除行所有列的值(前镜像)及ROWID。

但是对于select for update的情况如何呢?

1、接着前面的测试继续测试select for update操作:
--先建立一个测试表,选择都是字符类型是为了显示方便.而且不建立使用,这样好分析一些.

SQL> select * from v$version where rownum
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
create table t (a varchar2(10),b varchar2(10));
insert into t values('1','a');
insert into t values('2','b');
insert into t values('3','c');
commit;
SQL> select t.rowid,t.* from t;
ROWID              A          B
------------------ ---------- ----------
AABCltAAEAAAAWdAAA 1          a
AABCltAAEAAAAWdAAB 2          b
AABCltAAEAAAAWdAAC 3          c

SQL> @lookup_rowid AABCltAAEAAAAWdAAA
    OBJECT       FILE      BLOCK        ROW
---------- ---------- ---------- ----------
    272749          4       1437          0
2.执行select for update操作不提交:
SQL> select *  from t where a =2 for update;
SQL> select dbms_transaction.local_transaction_id()  x from dual ;
X
--------------------
18.13.154
SQL> select XIDUSN,XIDSLOT,XIDSQN,UBAFIL,UBABLK,UBAREC,STATUS from v$transaction;
    XIDUSN    XIDSLOT     XIDSQN     UBAFIL     UBABLK     UBAREC STATUS
---------- ---------- ---------- ---------- ---------- ---------- ----------------
        18         13        154          3        351          5 ACTIVE

--从以上操作发现,在select for update记录后UBAREC=5(0x05).
--从以上信息,可以知道在datafile 3 block 351.
--转储看看UBAREC=5的情况:(0x05)

alter system checkpoint ;
alter system dump datafile 3 block 20326;

********************************************************************************
UNDO BLK:
xid: 0x0012.00d.0000009a  seq: 0xb5  cnt: 0x5   irb: 0x5   icl: 0x0   flg: 0x0000
 Rec Offset      Rec Offset      Rec Offset      Rec Offset      Rec Offset
---------------------------------------------------------------------------
0x01 0x1f4c     0x02 0x1ec4     0x03 0x1e48     0x04 0x1de0     0x05 0x1d70

*-----------------------------
* Rec #0x5  slt: 0x0d  objn: 272749(0x0004296d)  objd: 272749  tblspc: 4(0x00000004)
*       Layer:  11 (Row)   opc: 1   rci 0x00
Undo type:  Regular undo    Begin trans    Last buffer split:  No
Temp Object:  No
Tablespace Undo:  No
rdba: 0x00000000Ext idx: 0
flg2: 0
*-----------------------------
uba: 0x00c0015f.00b5.02 ctl max scn: 0x0000.c0262e33 prv tx scn: 0x0000.c0262eb8
txn start scn: scn: 0x0000.c02638d7 logon user: 84
 prev brb: 12583535 prev bcl: 0
KDO undo record:
KTB Redo
op: 0x03  ver: 0x01
compat bit: 4 (post-11) padding: 1
op: Z
KDO Op code: LKR row dependencies Disabled
  xtype: XA flags: 0x00000000  bdba: 0x0100059d  hdba: 0x0100059a
itli: 2  ispac: 0  maxfr: 4858
tabn: 0 slot: 1 to: 0

--看看Rec=0x5,objn: 272749(0x0004296d)  objd: 272749就是对应的对象.tblspc: 4(0x00000004)对应的就是文件编号.
--bdba: 0x0100059d ,里面就包含了块号. slot: 1(0x1)对应的就是行号1.
--hdba: 0x0100059a,表示该对象的块头.
--另外由于该事务包含1个记录.rci=0x00,表示事务开始.

SQL> @dfb 0100059d
    RFILE#     BLOCK#
---------- ----------
         4       1437
SQL> @dfb 0100059a
    RFILE#     BLOCK#
---------- ----------
         4       1434
SQL> select object_name, OBJECT_ID ,DATA_OBJECT_ID  from dba_objects where object_name='T' and wner=user;
OBJECT_NAME           OBJECT_ID DATA_OBJECT_ID
-------------------- ---------- --------------
T                        272749         272749
SQL> select header_file,header_block from dba_segments where wner=user and segment_name='T';
HEADER_FILE HEADER_BLOCK
----------- ------------
          4         1434

--可以发现undo的信息基本上与insert一样,需要在UNDO中记录插入行的ROWID.

时间: 2024-09-20 12:23:56

[20130312]undo与select for update.txt的相关文章

[20130312]undo与DML-update.txt

[20130312]undo与DML-update.txt 闲着没事,研究一下undo与DML. DML操作在UNDO中的信息 通过Dump UNDO Block观察到DML操作记录在UNDO中的信息,主要为以下内容:1.对于Insert操作,需要在UNDO中记录插入行的ROWID.2.对于Update操作,需要在UNDO中记录被更新列的前镜像,同时也会记录被更新行的ROWID.3.对于Delete操作,需要在UNDO中记录被删除行所有列的值(前镜像)及ROWID. 1.接着前面的测试继续测试u

[20130312]undo与DML-delete.txt

[20130312]undo与DML-delete.txt 闲着没事,研究一下undo与DML. DML操作在UNDO中的信息 通过Dump UNDO Block观察到DML操作记录在UNDO中的信息,主要为以下内容:1.对于Insert操作,需要在UNDO中记录插入行的ROWID.2.对于Update操作,需要在UNDO中记录被更新列的前镜像的值,同时也会记录被更新行的ROWID.3.对于Delete操作,需要在UNDO中记录被删除行所有列的值(前镜像)及ROWID. 1.接着前面的测试继续测

[20130312]undo与DML-insert.txt

[20130312]undo与DML-insert.txt 闲着没事,研究一下undo与DML. DML操作在UNDO中的信息 通过Dump UNDO Block观察到DML操作记录在UNDO中的信息,主要为以下内容:1.对于Insert操作,需要在UNDO中记录插入行的ROWID.2.对于Update操作,需要在UNDO中记录被更新列的前镜像的值,同时也会记录被更新行的ROWID.3.对于Delete操作,需要在UNDO中记录被删除行所有列的值(前镜像)及ROWID. 1.先看来看Insert

[20170520]利用undo表空间保护数据.txt

[20170520]利用undo表空间保护数据.txt --//undo表空间是用来记录前映像信息,也用来保证查询时一致性的.上个星期去听一些课,提到不打开归档情况下一些维护技巧, --//就是建立多个redo日志文件,用来保存日志,至少维持3-4天甚至1个星期的日志,这样可以一定程度减少错误以及会查问题. --//另外提到一种利用undo表空间避免异常操作的恢复方法,就是再建立1个undo表空间,出现异常dml语句时切换使用新的undo表空间. --//这样可以非常从容的恢复信息.当然最好不要

MySQL 4.1.0 中文参考手册 --- 6.4 数据操纵:SELECT, INSERT, UPDATE, DELETE

mysql|select|参考|参考手册|数据|中文 MySQL 4.1.0 中文参考手册 --- 犬犬(心帆)翻译 MySQL Reference Manual for version 4.1.0-alpha. 6.4 数据操纵:SELECT, INSERT, UPDATE, DELETE6.4.1 SELECT 句法 SELECT [STRAIGHT_JOIN] [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT] [SQL_CACH

1120 11g select for update skip locked

[20171120]11g select for update skip locked.txt --//11G在select for update遇到阻塞时可以通过skipped locked跳过阻塞的记录,测试看看: 1.环境: SCOTT@book> @ &r/ver1 PORT_STRING                    VERSION        BANNER ------------------------------ -------------- -----------

mysql的行锁与表锁(select* .... FOR UPDATE)

mysql中使用select for update的必须针对InnoDb,并且是在一个事务中,才能起作用. select的条件不一样,采用的是行级锁还是表级锁也不一样. 由于 InnoDB 预设是 Row-Level Lock,所以只有「明确」的指定主键,MySQL 才会执行 Row lock (只锁住被选取的资料例) ,否则 MySQL 将会执行 Table Lock (将整个资料表单给锁住). 举个例子: 假设有个表单 products ,裡面有 id 跟 name 二个栏位,id 是主键.

ibatis 使用select for update不生效

问题描述 ibatis 使用select for update不生效 ibatis执行select for update不生效,但用命令执行没问题,请问是什么原因?ibatis是否支持select for update? 解决方案 http://www.yiibai.com/ibatis/ibatis_update_operation.html 解决方案二: SELECT FOR UPDATEselect for update与select for nowait有关""SELECT F

【MySQL】select for update 的Row Lock 与Table Lock

select for update 对表施加的锁模式分两种情况: 只有当where 条件中明确地使用指定主键时,MySQL 才会对表执行Row lock (只锁住被选取的数据) , 否则MySQL 将会执行Table Lock (将整个数据表单给锁住). 下面以具体的实例验证上面的结论: 注意 表mail_queue 的结构如下 root@127.0.0.1 : test 22:06:52> show create table mail_queue \G ********************