[转]什么是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

本文转自博客园沉睡森林@漂在北京的博客,原文链接:[转]什么是savepoint?,如需转载请自行联系原博主。

目录
相关文章
|
2月前
|
SQL 关系型数据库 MySQL
MySQL数据库——事务操作-begin-commit-rollback
MySQL数据库——事务操作-begin-commit-rollback
30 1
|
9月前
手动回滚、提交事务
手动回滚、提交事务
52 1
|
SQL 关系型数据库 MySQL
聊聊数据库中的 savepoint
故事要从全局二级索引开始讲起。 当我们构建了一个全局二级索引之后,一条逻辑上的数据插入,就会变成两条物理上的数据插入:一条插入到主表,另一条插入到索引表。为了保证主表和索引表数据的一致性,我们往往需要开启分布式事务,再并行地插入两条数据。如果其中一条数据插入失败了,比如索引上出现了唯一键冲突,但主表的数据已经插了进去,怎么办呢?
|
SQL 存储 安全
MySQL数据库(27):事务安全 transaction
MySQL数据库(27):事务安全 transaction
128 0
|
SQL 关系型数据库 MySQL
【MySQL】利用binlog回滚DML操作
数据库运行过程中难免会发生误操作,特别是在测试环境 开发人员或测试人员有时会误删或者更新错误某些数据。这时可以用binlog闪回DML操作。
355 0
|
SQL Oracle 关系型数据库
DDL会产生两次commit操作
DDL操作为什么需要两次commit操作呢?
|
Java 数据库连接
JDBC(七)事务Transaction
事务Transaction是一组要作为单一的原子动作进行的行为。 要么执行所有的操作,要么都不执行。 我们可以通过它来调用事务: connection.setAutoCommit(false); 如果在事务中间出现失败,就需要对事务进行回滚 connection.rollback(); 如果所有操作都没有失败,那最终需要提交。
874 0
|
Java 关系型数据库 数据库连接