首页 > Oracle > ORACLE中SAVEPOINT使用解析

ORACLE中SAVEPOINT使用解析

2010年5月25日 admin 发表评论 阅读评论

Savepoints 在实际编程中用得比较广,学会它能让你在PL/SQL编程上获得很大提高。下面简单介绍一下Oracle中SavePoint的使用。
你可以在事务上下文中声明称为savepoint的中间标记。Savepoint将一个长事务分隔为较小的部分。
使用savepoint,你可以在长事务中任何点任意标记你的操作。然后你可以选择回滚在事务中当前点之前、声明的 savepoint之后执行的操作。比如,你可以在一长段复杂的更新中使用savepoint,如果犯了个错,你不需要重新提交所有语句。
Savepoints 在应用程序中同样有用。如果一个过程包含几个函数,那可以在每个函数前创建一个savepoint。如果一个函数失败,返回数据到函数开始前的状态并在修 改参数或执行一个恢复操作后重新运行函数就非常容易。
在回滚到一个savepoint后,Oracle释放由被回滚的语句持有的锁。其他等待之前被锁资源的事务可以进行了。其他要更新之前被锁行的事 务也可以执行。
当一个事务回滚到一个savepoint,发生下列事件:
1. Oracle仅回滚savepoint之后的语句。
2. Oracle保留这一savepoint,但所有建立于此后的savepoints丢失。
3. Oracle释放在该savepoint后获得的所有表、行锁,但保留之前获得的所有锁。
事务保持活动并可继续。
无论何时一个会话在等待事务,到savepoint的回滚不会释放行锁。为了确保事务如果无法获得锁也不会悬挂(hang),在执行UPDATE 或DELETE前使用FOR UPDATE … NOWAIT。(这里指回滚的savepoint之前获得的锁。该savepoint后获得的行锁会被释放,之后执行的语句也会被彻底回滚。)

注意:
1.savepoint 名字保持唯一
2.如果后面新设置的一个savepoint的名字和前面的一个 savepoint名字重复,前一个savepoint将被取消
3.设置savepoint后,事务可以继续commit,全部回退或者回退到具体一个savepoints
4.撤销的处理必须是在没有发出commit命令的前提下才能有效。

代码示例:

SQL> create table test (id number(7));
表已创建。
SQL> insert into test values (3);
已创建 1 行。
SQL> savepoint a;
保存点已创建。
SQL> insert into test values (4);
已创建 1 行。
SQL> select * from test;
ID———-
3
4

SQL> rollback to a;
回退已完成。
SQL> select * from test;
ID
———-
3
SQL> rollback;
回退已完成。
SQL> select * from test;
未选定行

相关日志

分类: Oracle 标签: ,
  1. 本文目前尚无任何评论.
  1. 2010年6月4日17:26 | #1
Easy AdSense by Unreal