天天看点

Commit+Savepoint

Commit

commit操作用于结束一个事务,并使事务中所做的数据修改永久生效。

事务一旦提交以后,就不能再撤销,除非使用手工方式将数据块改回原状。

commit操作确保事务中的所有操作都成功以后,才会向用户返回成功结果。

要完成commit操作,必须执行以下几步:

  1. 在撤销表空间(undo表空间)的事务表中写入事务的唯一系统该编号(system change number,SCN)。
  2. Log writer 将重做日志信息及SCN写入重做日子文件。这些信息真正写入后,事务才能结束。这就是为何重做日志文件与LGWR进程的性能非常重要的原因。
  3. 释放锁。
  4. commit语句想用户进程返回成功代码。

commit操作对于数据库的稳定与系统性能都非常重要,为了辅助事务操作,Oracle系统中引入了保存点(savepoint)。

Savepoint

在一个运行时间较长的复杂事务中,可以中途使用

保存点来保存所做的工作。

创建保存点以后,可以僵尸舞回滚到指定的保存点,以修正一个长事务中出现的问题,而不必重新开始。

事务可以回滚到事务内的任何一个保存点,该保存点之后执行的SQL语句也会被回滚。

e.g

  1. 事务开始
  2. SQL
  3. 保存点a
  4. SQL
  5. 保存点b
  6. SQL
  7. 保存点c
  8. 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