回滚段
回滚段是在磁盘上的一段空间,当一个事务开始的时候,会首先把变化前得数据和变化后的数据先写入日志缓冲区,然后把变化前得数据写入回滚段,最后才是在数据缓冲区修改数据。回滚段中最少有2个区,一个事务不能跨越2个回滚段,每个回滚段都有一个回滚段头,回滚段头是一个block,记录了事务表信息,当发生一个事务的时候,就在回滚段的事务表中记录一条信息,包括事务的标志,事务的状态,使用回滚段块数等信息,假如一个段有3个区,而事务使用这3个区是按顺序的,如果此时第一个区被占用,而第2个区是空着的,那也不能使用第2个区,因为就需要扩容了,比如1-2,直到下个能被使用的区是空着的为止。
例如:
update set object_id=0 where object_id=12344;
commit;
这时数据库首先把该语句的整个操作包括的0和12344写入日志缓冲区,然后把数据12344和一些相关信息写入回滚段,最后把0修改到数据缓冲区,当发生提交命令时,如果日志缓冲区内容还没有写入日志文件则必须写入日志文件,然后回滚段会把该事务标记为已经提交,数据缓冲区中快的这些事务也标记为已经提交,当然如果我们回退这个事务,则数据库将把回滚段中数据“12344”读出来写回数据库缓冲区,这个回退的变化本身也被写入日志,这就是回退的过程。如果事务很大,那么在没有提交之前也可能会写入磁盘了,所以如果此时我们回退,那oracle必须再从缓冲区中读出来,所以代价很大。
查询数据库中commit的事务和rollback的事务
SQL> select name,value from v$sysstat where name in ('user commits','transaction rollbacks');
NAME VALUE
---------------------------------------------------------------- ----------
user commits 54873----此值是数据库创建以来累计的值
transaction rollbacks 48
如果是delete,那回滚段里就记录一行数据,如果是insert,那回滚段中就记录rowid。当事务提交以后,回滚段中就会标记事务已经提交,如果是回退,如果是delete,那回滚段就将整个行回退,如果是update,就将改变前的数据写回,如果是insert,那就在回滚段中将rowid清楚。
查看回滚段的个数和状态:
SQL> select usn,status from v$rollstat;
USN STATUS
---------- ---------------
0 ONLINE
1 ONLINE
2 ONLINE
3 ONLINE
4 ONLINE
5 ONLINE
6 ONLINE
7 ONLINE
8 ONLINE
9 ONLINE
10 ONLINE
已选择11行。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29773864/viewspace-1626282/ ,如需转载,请注明出处,否则将追究法律责任。