Oracle之savepoint

什么是savepoint?
Use
the SAVEPOINT statement to identify a point in a transaction to which you can
later roll back.
例如:
SQL> SELECT * FROM SCOTT.DEPT  ;

DEPTNO DNAME          LOC
------ -------------- -------------
    10 ACCOUNTING     NEW YORK
    20 RESEARCH         DALLAS
    30 SALES               CHICAGO
    40 OPERATIONS      BOSTON
SQL> UPDATE
SCOTT.DEPT  SET loc ='a' WHERE loc='NEW YORK';

1 row updated
SQL>
SAVEPOINT a;

Savepoint created
SQL> UPDATE SCOTT.DEPT  SET loc ='b'
WHERE loc='DALLAS';

1 row updated
SQL> SAVEPOINT
b;

Savepoint created
SQL> ROLLBACK TO SAVEPOINT a;

Rollback
complete
SQL> COMMIT;

Commit complete
SQL> SELECT * FROM
SCOTT.DEPT  ;

DEPTNO DNAME          LOC
------ -------------- -------------
    10 ACCOUNTING     a
    20 RESEARCH         DALLAS
    30 SALES               CHICAGO
    40 OPERATIONS      BOSTON

事务中的Savepoints
你可以在事务上下文中声明称为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
(Savepoint
names must be distinct within a given transaction. If you create a second
savepoint with the same identifier as an earlier savepoint, then the earlier
savepoint is erased. After a savepoint has been created, you can either continue
processing, commit your work, roll back the entire transaction, or roll back to
the savepoint.)
4.撤销的处理必须是在没有发出commit命令的前提下才能有效。
如下:在commit;后执行rollback
to savepoint失败
SQL> SELECT * FROM SCOTT.DEPT  ;

DEPTNO DNAME          LOC
------ -------------- -------------
    10 ACCOUNTING     NEW YORK
    20 RESEARCH       DALLAS
    30 SALES          CHICAGO
    40 OPERATIONS     BOSTON
SQL> UPDATE
SCOTT.DEPT  SET loc ='a' WHERE loc='NEW YORK';

1 row updated
SQL>
SAVEPOINT a;

Savepoint created
SQL> UPDATE SCOTT.DEPT  SET loc ='b'
WHERE loc='DALLAS';

1 row updated
SQL> SAVEPOINT
b;

Savepoint created
SQL> COMMIT;

Commit complete
SQL>
ROLLBACK TO SAVEPOINT a;

ROLLBACK TO SAVEPOINT a

ORA-01086:
从未创建保留点 'A'
SQL> SELECT * FROM SCOTT.DEPT  ;

DEPTNO DNAME          LOC
------ -------------- -------------
    10 ACCOUNTING     a
    20 RESEARCH       b
    30 SALES          CHICAGO
    40 OPERATIONS     BOSTON

Oracle之savepoint的更多相关文章

  1. Oracle中SAVEPOINT和ROLLBACK用法

    savepoint是事务内部允许部分rollback的标志符.因为事务中对记录做了修改,我们可以在事务中创建savepoint来标识不同的点.如果遇到错误,就可以rollback到不同的点或直接回来事 ...

  2. 【Oracle】(savepoint)保存点的使用

    作用 保存点可以回退到事务的一部分,我们在操作数据库的过程中可以对事务分隔为几个部分,在操作失误的时候就可以回滚到某个点即可. 实现步骤 我们现在新建一张表TMP003 )); 第一步:插入第一条记录 ...

  3. 数据库路由中间件MyCat - 源代码篇(14)

    此文已由作者张镐薪授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 对于表的dataNode对应关系,有个特殊配置即类似dataNode="distributed(d ...

  4. PL/SQL 学习分享(续)

    事务 事务的概述 事务的特性 回滚点 事务实例练习 动态SQL 动态SQL概述 动态SQL应用场合 动态SQL的执行语法 绑定变量 动态SQL创建表 动态SQL绑定变量 动态SQL综合案例添加数据 使 ...

  5. 4.事务提交过程,交易的基本概念,Oracle交易周期,保存点savepoint,数据库的隔离级别

     事务提交过程 事务 基本概念 概念:一个或者多个DML语言组成 特点:要么都成功.要么都失败 事务的隔离性:多个client同一时候操作数据库的时候.要隔离它们的操作, 否则出现:脏读  不可反 ...

  6. Oracle Savepoint

    1.目的: Use the SAVEPOINT statement to identify a point in a transaction to which you can later roll b ...

  7. Oracle中的SAVEPOINT

    学习存储过程中使用断点回滚事务时,发现目前网络上存在一个问题,那就是使用断点回滚后,都忘记了一个很重要的事情,提交事务.虽然使用了断点回滚,但是断点回滚不像rollBack或commit一样结束当前事 ...

  8. Oracle 的基本操作符

    != 不等于 select empno,ename,job from scott.emp where job!='manager' ^= 不等于 select empno,ename,job from ...

  9. Oracle 数据库语句大全

    Oracle数据库语句大全 ORACLE支持五种类型的完整性约束 NOT NULL (非空)--防止NULL值进入指定的列,在单列基础上定义,默认情况下,ORACLE允许在任何列中有NULL值. CH ...

随机推荐

  1. Pro Aspnet MVC 4读书笔记(3) - Essential Language Features

    Listing 4-1. The Initial Content of the Home Controller using System; using System.Collections.Gener ...

  2. solaris X86-64下一个ORACLE战斗11.2.0.3.8在一波折叠补丁

    solaris X86-64下一个ORACLE战斗11.2.0.3.8补丁: 正确的步骤: 1.BUG6880880 .OPATCH补丁 2.BUG16902043.11.2.0.3.8补丁 情感是练 ...

  3. ubuntu14.04(64位置) ADB Not Responding

    今天装了一个很搞笑的比率Ubuntu14.04  还安装Android studio    写app   执行错误: Adb not responding. you can wait more or ...

  4. java 7K交通灯管理系统面试题

    交通灯管理系统 模拟实现十字路口的交通灯管理系统逻辑.详细需求例如以下: 1. 异常随机生成依照各个路线行驶的车辆.    比如:    由南向而来去往北向的车辆----直行车辆    由西向而来去往 ...

  5. java数据结构系列之——数组(1)

    import javax.management.RuntimeErrorException; public class MyArray { private long array[]; private ...

  6. 写得好 git 提交信息

    编写好 git 提交信息 提交信息 我们作出答复,更改将提交相关信息,这些信息通常被认为是重要的信息会小心留下应该离开,你为什么需要这个提交实例,提交解决任何问题. 我们需要良好的信息组织,虽然后来, ...

  7. typedef和define具体的具体差异

      1) #define这是一个预处理指令,简单的更换当预处理程序.不检查的正确性,仍不能正常关机进入的意思,那里只是已被展开时编译源代码会发现可能的错误和错误. 例如: #define PI 3.1 ...

  8. HDU 5281 Senior's Gun (贪心)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5281 贪心题目,但是看看我的博客里边相关贪心的题解实在是少的可怜,这里就写出来供大家一起探讨. 题意还 ...

  9. BNUOJ 34981 A Matrix

    BNUOJ 34981 A Matrix 题目地址:pid=34981" style="color:rgb(0,136,204); text-decoration:none&quo ...

  10. javascript中对字符串的操作总结

    原文:javascript中对字符串的操作总结 没听过一句话吗?程序员的世界,不处理字符串就是处理数组.这是群里的一位前辈和我说的,显然这和我之前理解的DOM是javascript的核心的不同的,看了 ...