本文参考了下文的一些内容:
http://www.bigwww.com/info/html/edu/database/20071226/22283.html
保存点(savepoint)是事务处理过程中的一个标志,和回滚命令(rollback)结合使用,主要的用途是允许用户将某一段处理回滚而不必回滚整个事务,这在pl/sql研发中还是非常有用处的。
下面的例子中,把savepoint标记在insert语句之前,如果这条insert语句试图将重复的数据保存到emp表中的话,将触发执行预先定义的dup_val_on_index例外处理,在这里面的rollback to do_insert命令将回滚上面的那条insert操作,而不会影响前面的所有操作。
也就是说,savepoint就是把begin trans 和 commint trans之间的事务更加细化了,相当于一个大的事务里面含有多个小的事务。如果中间在某个savepoint之后rollback trans,那么在此之前的最后一个save trans之后的操作就都被rollback了,但是之前的修改由于被save trans了,所以就会提交。
如果你定义了多个savepoint,当你指定回滚到某个savepoint时,那么回滚操作将回滚这个savepoint后面的所有操作(即使后面可能标记了n个savepoint)。例如,在一段处理中你定义了五个savepoint,从第三个savepoint回滚,后面的第四、第五个标记的操作都将被回滚,如果不使用rollback to savepoint_name而使用rollback,将会滚整个事务处理。
如果你在递归子程式里面定义了一个savepoint, 如果每一个递归层都设置了savepoint. 此时, 你只能回滚到最近的一个savepoint.
savepoint的声明能在同一个事务处理里面重复定义. 他的作用就是把savepoint从上一个位置转移到目前的位置. 因而,执行回滚也只回滚到最近的savepoint.