Commit
commit操作用于结束一个事务,并使事务中所做的数据修改永久生效。
事务一旦提交以后,就不能再撤销,除非使用手工方式将数据块改回原状。
commit操作确保事务中的所有操作都成功以后,才会向用户返回成功结果。
要完成commit操作,必须执行以下几步:
- 在撤销表空间(undo表空间)的事务表中写入事务的唯一系统该编号(system change number,SCN)。
- Log writer 将重做日志信息及SCN写入重做日子文件。这些信息真正写入后,事务才能结束。这就是为何重做日志文件与LGWR进程的性能非常重要的原因。
- 释放锁。
- commit语句想用户进程返回成功代码。
commit操作对于数据库的稳定与系统性能都非常重要,为了辅助事务操作,Oracle系统中引入了保存点(savepoint)。
Savepoint
在一个运行时间较长的复杂事务中,可以中途使用
保存点来保存所做的工作。
创建保存点以后,可以僵尸舞回滚到指定的保存点,以修正一个长事务中出现的问题,而不必重新开始。
事务可以回滚到事务内的任何一个保存点,该保存点之后执行的SQL语句也会被回滚。
e.g
- 事务开始
- SQL
- 保存点a
- SQL
- 保存点b
- SQL
- 保存点c
- SQL
事务在任何时候都可以回滚到保存点a,此时保存点a后执行的所有SQL都将被回滚,但不能仅在保存点a和b之间回滚事务。
SQL> select * from name;
I NAME
---------- ------------------------------------------------------------
1 aaa
3 www
3 www
SQL> insert into name values(1,'qqq');
1 row created.
SQL> savepoint a;
Savepoint created.
SQL> insert into name values(2,'zzz');
1 row created.
SQL> savepoint b;
Savepoint created.
SQL> select * from name;
I NAME
---------- ------------------------------------------------------------
1 aaa
3 www
3 www
1 qqq
2 zzz
SQL> rollback to savepoint a;
Rollback complete.
SQL> select * from name;
I NAME
---------- ------------------------------------------------------------
1 aaa
3 www
3 www
1 qqq