Oracle数据库的
DML命令的处理过程是本文我们主要要介绍的内容,从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了。51Testing软件测试网-m2n^il-j i DML语句与undo
O @XX Mh&{051Testing软件测试网+G X8Z/K@3erI{ 当我们发出一条DML(比如update tab set col1='A' where col1='B')语句时,其执行过程可大致概括为以下几步。
N6y%b Q;EIuQ0X)o0i&qws0 1、在shared pool里进行解析,从而生成执行计划。51Testing软件测试网:@,Draj6n;]g1u
r|w;m7?q4v0 2、假设根据执行计划,得出col1='B'的记录存放在10号数据文件的54号数据块里。
p^/O&n*vOLQ/l0e(v/l!K0U+g0 3、服务器进程在buffer cache里找一个可用的undo数据块,如果没有发现,则到undo表空间里找一个可用的undo块,并调入buffer cache。假设获得的undo数据块号为24号,位于11号undo数据文件里。
h9hSw^Y051Testing软件测试网+O-dlD`Rb]q4](kB 4、将改变前的值,也就是A放入11号undo数据块。51Testing软件测试网+I l[vA
b
Z[
51Testing软件测试网OO-\#F
hs[1}$g4x%K 5、由于undo数据块发生了变化,于是产生重做记录,假设重做记录号为120。
6m.I ck#kI0`8|,^UY0 行号 事务id file# block# row column value
wI
`f B3O`!XK051Testing软件测试网{m(se d#m"z0P
\ 120 T1 24 11 10 col1 A51Testing软件测试网#m;gfJ
vo$r
51Testing软件测试网0Iae i8n-RB 6、在buffer cache里找到54号数据块。如果没有发现,则从10号数据文件里调入。51Testing软件测试网3m o2H0iR siz8e
1kiw f9^P2?0 7、将改变后的值,也就是B放入54号数据块。51Testing软件测试网6f
~1S;a#P!NOn
51Testing软件测试网l ^HE(~8T-U 8、由于数据块发生了变化,于是产生重做记录,假设重做记录号为121。
/Q%fp6O"s051Testing软件测试网GA Dq|5m,N;p 行号 事务id file# block# row column value
2T/IC'_zZ8`0?'~.|\4{pJW0 121 T1 10 54 10 col1 B51Testing软件测试网"q*K$u#V
d
.ly#LV+tu+]
e0 9、控制权返回给用户,如果在SQL*Plus里执行DML,则表现为光标返回。
$i!J4yP[-}:S051Testing软件测试网!y
^xP+P8R2\)pi 10、当用户发出commit命令时,触发LGWR进程,将120与121这两个重做记录写入联机日志文件,并将54号数据块和11号undo数据块头部所记录的事务状态标记设置为已提交。然后控制权返回给用户,如果在SQL*Plus里执行DML操作,则表现为光标返回。
2c e{ gZYy%lk~051Testing软件测试网*?.C D9z5WNg#I 11、这个时候,54号数据块以及11号undo块并不一定被DBWn写入数据文件。只有在脏数据块的数量达到一定程度才会被写入。
kW{c.g(n:C*I051Testing软件测试网"C/B*xwe0D$W7n 事务只要被提交或回滚,那么该事务所使用的undo块就可以被覆盖。对于上面的例子来说,当第10步,用户发出commit命令以后,11号undo块里的数据就可以被其他事务所覆盖。
0W:{:d#aEE k Z-T ?#T0@K-M#wY:F.q'm0 关于Oracle数据库的DML命令的处理过程的相关知识就介绍到这里了,希望本次的介绍能够对您有所收获!51Testing软件测试网
L0Uaw/~