commit是提交事务,那么commit到底做了什么?

     其实commit做的并不多,它出发LGWR进程,将重做的记录写入联机日志,并且将修改的数据的数据库头部标记为已提交。提交后,undo快可以被其他 事务调用覆盖,只有到达一定条件后出发ckpt进程才会把SGA中的数据写入数据文件。其他的一些操作在commit之前已经操作完成,所以,即使很大的 数据量修改在commit的时候也不会消耗很多的时间。

     在commit之前,加入执行一个update操作,首先会在share pool里解析生成执行计划,然后根据执行计划找到相关数据文件的数据块,调入buffcache,并在里面找到一个可以用的undo数据块,如果没有则从undo表空间里找并且调入buff cache。把修改之前的值放在undo数据块,修改后的值放在相关数据的数据块。在数据块发生过程中记录两次重做记录,并且记录重做记录号。在没有 commit或者rollback之前不会释放DML锁。

     需要注意的是,由于在commit之前数据库做了很多操作,所以rollback会很消耗资源(对于相当大量的DML操作)