事务的执行3
接下来同时做三个工作。重做数据,还原数据,维护检查点队列。重做数据是由重做条目组成,每个重做条目对应一个数据块的修改,该重做条目记录了产生事务开始的scn和时间戳、事务编号、事务提交scn和时间戳、修改的类型以及修改的段的所属的类型和名称。重做条目生成后,会先存入重做日志缓冲区,再由日志写进程协调并整体刷新到联机重做日志以持久化保存,LGWR会在任何一个提交的时候、缓冲区三分之一满或记录1M缓冲数据时、联机重做日志组发生切换时、数据库写进程(DBWn)执行之前以及自上次日志写完后三秒钟时的任何一个条件成立时执行。还原数据是缓存高速缓冲区中原始的未修改的数据块的副本,在事务开始执行时由系统复制到还原表空间的还原段内保存,生成还原数据。如果因为存储空间不足等原因导致还原数据没有成功产生,则事务报错不允许执行。与此同时还必须维护检查点队列,新的检查点间隔都对应有新创建的一个检查点队列,该队列会记录凡是在当前检查点间隔之内开始执行的事务所要修改的每一个数据块的内存偏移量和提交状态。检查点队列中记录的数据块的顺序与重做条目写入重做日志的顺序一致。
oracle通过操作系统的配合在CPU通用寄存器进行计算,修改相应的数据块,完成后给客户端应用发送已更新提示。服务器进程在收到用户发出的commit语句,会把检查点队列中相关数据块的提交状态改为已提交,并释放持有的锁资源,并返回给用户进程提交完成的信息。
在用户看来,通过updata和commit语句对数据库的修改就全部执行成功了,但在管理员视野中,这个修改只是在内存中的修改,还需要写入磁盘文件来持久化保存。那么内存中用户提交的数据块是如何写入到磁盘中,这和检查点有关系。