对与DML操作Oracle在内部按如下顺序执行:
1,相应事务分配回滚段(undo segment).
2,分配回滚段后,在回滚段头上创建事务表slot(transaction table slot).
3.创建事务表后会生出TXID(TransactionID),再将TXID分配给当前事务。这个值指向分给事务的回滚段头上存在的事务表的准确位置。
4.事务对象的数据块载入到高速缓冲区,在块头的ITL(Intersted transaction list)上登记事务条目。
如果itl上没有所需空间,就会发生等待enq:TX-allocate ITL entry。
5.将需要修改的块的修改信息存储到PGA,存储的方式是change vector,之后进程将PGA中的change vector以redo record复制到重做缓冲区。
6.将之前映像信息记录到撤销块,继而修改数据块,被修改的数据块变为脏状态。而且在高速缓冲区中创建以修改的数据块的CR块。
7.执行commit后给事务分配SCN,提交信息存储在重做缓冲区。
8.回滚段头的事务表中存储已成功提交的信息,结束包括TX锁在内的所有资源占有。
9.重做缓冲区的内容记录在重做日志文件上。
下面通过转储来探究一下这个过程:
- 会话1
- SQL> update emp set sal=sal+100 where rownum=1;
-
- 1 rows updated.
- 获得已执行update行位置
- SQL> select rowid,dbms_rowid.rowid_relative_fno(rowid) as fno,
- 2 dbms_rowid.rowid_block_number(rowid) as blkno
- 3 from emp where rownum=1;
-
- ROWID FNO BLKNO
- ------------------ ---------- ----------
- AAAQ+LAAEAAAAAfAAA 4 31
-
- file number是4,block number是31,dump 这个block。
-
- SQL> alter system dump datafile 4 block 31;
-
- System altered.
- SQL> l
- 1 SELECT a.VALUE
- 2 || b.symbol
- 3 || c.instance_name
- 4 || "_ora_"
- 5 || d.spid
- 6 || ".trc" trace_file
- 7 FROM (SELECT VALUE
- 8 FROM v$parameter
- 9 WHERE NAME = "user_dump_dest") a,
- 10 (SELECT SUBSTR (VALUE, -6, 1) symbol
- 11 FROM v$parameter
- 12 WHERE NAME = "user_dump_dest") b,
- 13 (SELECT instance_name
- 14 FROM v$instance) c,
- 15 (SELECT spid
- 16 FROM v$session s, v$process p, v$mystat m
- 17* WHERE s.paddr = p.addr AND s.SID = m.SID AND m.statistic# = 0) d
- SQL> /
-
- TRACE_FILE
- --------------------------------------------------------------------
- /opt/app/oracle/diag/rdbms/liqian/liqian/trace/liqian_ora_4118.trc
Oracle 11g执行计划固定-BaselineUbuntu MySQL 安装和用户登录相关资讯 Oracle入门教程
- 使用SQLT来构建Oracle测试用例 (08/28/2014 06:17:41)
- Oracle AUTOTRACE 统计信息 (02/18/2013 08:25:40)
- Linux Oracle服务启动&停止脚本与 (12/16/2012 14:42:37)
| - Oracle入门教程:把表和索引放在不 (07/13/2013 11:21:40)
- Oracle直接路径加载--append的深度 (02/07/2013 08:26:36)
- Oracle Connect By用法 (12/16/2012 13:36:10)
|
本文评论 查看全部评论 (0)