`

[转]什么是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
分享到:
评论

相关推荐

    Sql语法转换为Oracle语法

    8. 事务处理:SQL Server使用 `BEGIN TRANSACTION`,`COMMIT` 和 `ROLLBACK`,Oracle也有对应的 `BEGIN`,`COMMIT` 和 `ROLLBACK`,但Oracle还提供了保存点(SAVEPOINT)功能。 9. 函数和内置操作:例如,SQL ...

    不同数据库sql语言差异化转换(sqlserver-->oracle)

    两个数据库系统的事务控制语句`BEGIN TRANSACTION`, `COMMIT`, 和 `ROLLBACK`基本保持一致,但在异常处理上,Oracle的`SAVEPOINT`和`RELEASE SAVEPOINT`比SQL Server更为灵活。 8. **视图和连接** 视图的创建和...

    oracle转mysql.rar

    此外,Oracle的保存点(SAVEPOINT)在MySQL中也有相应的实现,但语法有所不同。 索引方面,Oracle支持函数索引、位图索引等,而MySQL主要使用B-Tree索引,但在5.7及以上版本中引入了InnoDB的函数索引。在处理大量...

    apache-seatunnel-incubating-2.3.1源码

    Apache Seatunnel,孵化于Apache软件基金会,是一款强大的数据处理和转换框架,主要应用于大数据领域。Seatunnel设计的目标是简化数据预处理流程,提供一个统一的、易于使用的接口,让用户能够快速构建数据管道,...

    Oracle_ProC编程

    ##### 3.1 什么是Oracle预编译程序? Oracle预编译程序是一种特殊的编译器,能够将嵌入在C/C++源代码中的SQL语句转换成可以被Oracle数据库解释执行的格式,从而使程序员能够更加高效地与数据库进行交互。 ##### ...

    空间数据库实习SQL保存点和线

    在SQL中,`SAVEPOINT`和`ROLLBACK TO SAVEPOINT`命令用于实现这一功能: ```sql BEGIN; -- 执行一系列操作 SAVEPOINT my_savepoint; -- 如果出现错误 ROLLBACK TO SAVEPOINT my_savepoint; COMMIT; ``` 总的来说,...

    Oracle Proc编程

    **2.1 什么是Oracle预编译程序?** - **Oracle预编译程序**(如Pro*C/C++)是一种工具,它能够将包含SQL语句的C语言程序转换为标准的C语言源代码文件,从而使得这些SQL语句可以被编译成可执行程序。 - 这种预编译...

    PROC程序设计教程3,个人总结整理, 喜欢的下

    SAVEPOINT允许在事务中设置多个保存点,这样在需要时,可以仅回滚到某个保存点,而不必完全回滚整个事务。这对于处理复杂的事务逻辑非常有用。 **ROLLBACK语句** 1. **基本ROLLBACK**:撤销事务内所有数据更改,...

    玩转oracle学习笔记(三)-Oracle操作

    5. **事务处理**:了解事务的概念,掌握COMMIT、ROLLBACK和SAVEPOINT操作,确保数据的一致性和完整性。 6. **索引**:学习如何创建和管理索引,提高查询效率,包括B树索引、位图索引等。 7. **视图**:创建和使用...

    Flink实战总结1

    Savepoint是Flink中的一种快照机制,可以在job执行过程中创建快照,以便在出现故障时可以从快照恢复。 Flink的Checkpoint机制可以自动将job的状态保存到状态后端,例如RocksDBStateBackend等。Checkpoint的管理、...

    dbmove_sql语句转化.zip_MYSQL_dbmove_oracle

    如Oracle使用COMMIT和ROLLBACK,MySQL同样如此,但还可以使用START TRANSACTION、COMMIT和ROLLBACK TO SAVEPOINT。 8. **权限管理**: Oracle的GRANT和REVOKE语句在MySQL中也有对应的语法,但具体的权限级别和选项...

    Oracle proc

    ##### 3.1 什么是ORACLE预编译程序? Oracle预编译程序(Pro*C/C++)是一种工具,它允许开发者将SQL语句直接嵌入到C/C++源代码中,从而实现数据库操作。预编译器会将这些嵌入式的SQL语句转换成可以直接由Oracle...

    oracle基初语法

    本文将深入探讨Oracle的基本语法,包括插入(INSERT)、更新(UPDATE)、删除(DELETE)以及查询(SELECT)等操作,同时也会提及一些常用的SQL函数和事务管理,如SAVEPOINT、COMMIT和ROLLBACK。 1. **INSERT语句**...

    oracle+proc中文.pdf

    首先,文件提到了ORACLE预编译程序的概念,解释了什么是预编译程序,并讨论了为什么要使用它。预编译程序的一个重要优点是,它使得SQL语句能够与C或C++代码无缝集成,这提高了代码的可读性和可维护性。同时,文件也...

    oracle函数API和错误码大全.rar

    此外,还有`EXECUTE IMMEDIATE`用于动态执行SQL语句,以及`SAVEPOINT`和`ROLLBACK TO SAVEPOINT`用于事务管理。 在数据库操作中,遇到错误是常见的现象。Oracle错误码为开发者提供了解决问题的方向。例如,错误码`...

    oracle_专家高级编程 中文 第八章

    例如:`SAVEPOINT my_savepoint;` #### 三、事务中的原子性 - **原子性的意义**:原子性是指事务中的每个操作都作为一个整体被处理,要么全部成功,要么全部失败。这意味着单个语句也具有原子性,要么完全执行成功...

    数据库基础知识宣贯.pdf

    包括DDL(数据定义语言)如CREATE、ALTER和DROP,DML(数据操纵语言)如INSERT、UPDATE、DELETE和SELECT,DQL(数据查询语言)用于基本查询和排序,TCL(事务控制语言)如COMMIT、SAVEPOINT和ROLLBACK,以及DCL...

    Flink技术参考手册.docx

    ### 为什么选择Flink? Flink之所以受到青睐,主要因为它具有以下优势: 1. **事件驱动(Event-driven)**:Flink以事件为基本单位进行处理,能够实时响应事件的发生,适合实时数据处理场景。 2. **有状态流处理**...

    oracle语法详解

    SAVEPOINT my_savepoint; ROLLBACK TO my_savepoint; ``` #### 七、一致性与事务一致性 一致性是事务控制的核心概念之一。Oracle通过一致性机制确保数据只在事务完全完成后才对用户可见。 - **事务一致性级别**...

    Oracle学习教程&进阶

    在Oracle中,你需要理解事务的ACID属性(原子性、一致性、隔离性和持久性),以及如何使用COMMIT、ROLLBACK和SAVEPOINT来管理事务。同时,锁机制用于控制并发访问,防止数据不一致,如共享锁和独占锁的使用是这部分...

Global site tag (gtag.js) - Google Analytics