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. 会话1  
  2. SQL> update emp set sal=sal+100 where rownum=1;  
  3.   
  4.  1 rows updated.  
  5. 获得已执行update行位置  
  6. SQL> select rowid,dbms_rowid.rowid_relative_fno(rowid) as fno,  
  7.   2  dbms_rowid.rowid_block_number(rowid) as blkno  
  8.   3  from emp where rownum=1;  
  9.   
  10. ROWID                     FNO      BLKNO  
  11. ------------------ ---------- ----------  
  12. AAAQ+LAAEAAAAAfAAA          4         31  
  13.   
  14. file number是4,block number是31,dump 这个block。  
  15.   
  16. SQL> alter system dump datafile 4 block 31;  
  17.   
  18. System altered.  
  19. SQL> l     
  20.   1  SELECT    a.VALUE  
  21.   2         || b.symbol  
  22.   3         || c.instance_name  
  23.   4         || '_ora_'  
  24.   5         || d.spid  
  25.   6         || '.trc' trace_file  
  26.   7    FROM (SELECT VALUE  
  27.   8            FROM v$parameter  
  28.   9           WHERE NAME = 'user_dump_dest') a,  
  29.  10         (SELECT SUBSTR (VALUE, -6, 1) symbol  
  30.  11            FROM v$parameter  
  31.  12           WHERE NAME = 'user_dump_dest') b,  
  32.  13         (SELECT instance_name  
  33.  14            FROM v$instance) c,  
  34.  15         (SELECT spid  
  35.  16            FROM v$session s, v$process p, v$mystat m  
  36.  17*          WHERE s.paddr = p.addr AND s.SID = m.SID AND m.statistic# = 0) d  
  37. SQL> /  
  38.   
  39. TRACE_FILE  
  40. --------------------------------------------------------------------  
  41. /opt/app/oracle/diag/rdbms/liqian/liqian/trace/liqian_ora_4118.trc  
  • 1
  • 2
  • 3
  • 下一页

相关内容