oracle 的DML命令的详细处理过程

对于DML语句来说,只要修改了数据块,Oracle数据库就会将修改前的数据保留下来,保存在undo segment里,而undo segment则保存在undo表空间里。从Oracle 9i起,有两种undo的管理方式:自动Undo管理(Automatic Undo Management,简称AUM)和手工Undo管理(Manual Undo Management,简称MUM)。Oracle 9i之前只能使用MUM,而且在MUM中,undo segment又叫做rollback segment。从Oracle 9i起,Oracle就建议使用AUM,而不应再使用MUM了。

DML语句与undo 

当我们发出一条DML(比如update tab set col1='A' where col1='B')语句时,其执行过程可大致概括为以下几步。

1、在shared pool里进行解析,从而生成执行计划。

2、假设根据执行计划,得出col1='B'的记录存放在10号数据文件的54号数据块里。

3、服务器进程在buffer cache里找一个可用的undo数据块,如果没有发现,则到undo表空间里找一个可用的undo块,并调入buffer cache。假设获得的undo数据块号为24号,位于11号undo数据文件里。

4、将改变前的值,也就是A放入11号undo数据块。

5、由于undo数据块发生了变化,于是产生重做记录,假设重做记录号为120。

       行号     事务id   file#   block#  row     column      value

        120     T1           24      11        10         col1            A  

6、在buffer cache里找到54号数据块。如果没有发现,则从10号数据文件里调入。

7、将改变后的值,也就是B放入54号数据块。

8、由于数据块发生了变化,于是产生重做记录,假设重做记录号为121。

       行号     事务id   file#   block#  row     column      value

       121         T1      10         54       10        col1            B  

9、控制权返回给用户,如果在SQL*Plus里执行DML,则表现为光标返回。

10、当用户发出commit命令时,触发LGWR进程,将120与121这两个重做记录写入联机日志文件,并将54号数据块和11号undo数据块头部所记录的事务状态标记设置为已提交。然后控制权返回给用户,如果在SQL*Plus里执行DML操作,则表现为光标返回。

11、这个时候,54号数据块以及11号undo块并不一定被DBWn写入数据文件。只有在脏数据块的数量达到一定程度才会被写入。

事务只要被提交或回滚,那么该事务所使用的undo块就可以被覆盖。对于上面的例子来说,当第10步,用户发出commit命令以后,11号undo块里的数据就可以被其他事务所覆盖。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/9399028/viewspace-681077/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/9399028/viewspace-681077/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值