DML操作Oracle在内部实现



对与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 

猜你喜欢

转载自cuug789.iteye.com/blog/2051681
今日推荐