1、oracle commit 以后是否可以回滚,rollback 是否必须写在commit之前
分为几种不同情况。
1.没有提交(commit)的数据删除后无法rollback
2.提交(commit)了的数据删除后可以使用rollback恢复
3.删除数据后提交(commit)则无法使用rollback恢复
就是说,你提交了的数据是永久性的,rollback是在这个基础上进行备份的。
2、Oracle执行commit后到底做了什么?
A、从databuffer中写数据给datafile;
B、从log_buffer中写数据给redofile;
C、同时发生一个checkpoint,在redo,datafile,Arcn(如有归档)中打上timestamp
COMMIT是一个非常快的操作,当我们发布commit命令时,真正困难的动作已经完成,
在数据库中已经执行了数据更改,所以已经完成了99%的任务,例如:下列操作已经产生:
1)在SGA(Buffer Cache)中已经生成了undo块;
2)在SGA(Buffer Cache)中已经生成了产生改变的数据块和索引块;
3)在REDO LOG BUFFER生成了前面两项的redo信息;
4)依赖于前三项产生的数据量大小以及操作需要的时间,buffer中的数据可能已经
有一部分输出到了磁盘;
5)所有需要的锁已经获得;
当执行COMMIT命令时,只执行如下操作:
1)为事务生成SCN:SCN是ORACLE数据库的一种计时信息,用以保证事务的顺序性,
同时还用于失败恢复和保证数据库的读一致性和检查点,无论何时何人提交,SCN
自动加1;
2)将事务相关的未写入redo log file中的redo信息从redo log buffer写入到redo log
file,这才是真实的COMMIT,这步操作完成,说明我们已经完成COMMIT,事务从
V$TRANSACTION中移除;
3)V$LOCK中记录的SESSION关于该事务的锁会释放,其他需要这些锁的事务被唤醒;
4)执行块清理,清理块头保存的事务信息
3、COMMIT语句处理顺序
当事务提交时,Oracle分配一个唯一的顺序号SCN(System Change Number)给事务。数据库恢复总是基于该SCN号来进行处理。SCN号是记录在控制文件、数据文件、块头及重做日志文件中。
COMMIT处理步骤:
Oracle 在下面情况提交事务:
l 发出一个COMMIT语句。
l 执行DDL语句时。
l 离开Oracle时。
Oracle处理COMMIT的顺序是:
1)服务器为每个COMMIT产生一个SCN。使改变永久化。
2)LGWR进程将日志缓冲区数据并带有SCN一起写到重做日志文件。
3)服务器释放表级和行级锁。
4)用户被提示COMMIT完成。
5)服务器使事务已完成。
Oracle处理ROLLBACK的顺序是:
当下面情况发生时执行回滚:
l 发出ROLLBACK命令。
l 服务器进程放弃地终止。
l 会话被DBA终止。
ROLLBACK 是对数据库的操作进行撤消,步骤有:
1)服务器进程不做任何的改变。
2)服务器释放表级和行级锁。
3) 服务器使事务已完成。