Oracle 回滚详解(rollback)

文章目录

  • 1 概述
    • 1.1 目的
    • 1.2 语法
  • 2 例子
    • 2.1 rollback
    • 2.2 rollback to savepoint xx
    • 2.3 rollback work force 'string'

1 概述

1.1 目的

  • 撤销(undo)当前的事务
  • 与它相反的是 commit (提交当前的事务)
  • Oracle 12c 官方文档 - rollback 解释

1.2 语法

Oracle 回滚详解(rollback)_第1张图片

ROLLBACK [ WORK ]
   [ TO [ SAVEPOINT ] savepoint
   | FORCE string
   ] ;
关键字 解释 备注
work 可选的,为实现SQL标准兼容性而提供 可写可不写,结果都一样
to savepoint clause 指定要将当前事务回滚到的保存点 如果省略此子句,则该 rollback 语句将回滚整个事务
force string 仅回滚指定的事务,不会对当前的事务产生影响 string:事务id,可通过 dba_2pc_pending 进行查询

2 例子

基础数据准备:

-- 学生信息表
CREATE TABLE stu_info AS (
   id   number(10),
   name varchar2(30),
   sex  varchar2(2)
);

-- 添加主键约束
ALTER TABLE stu_info
  ADD CONSTRAINT pk_sut_info_id PRIMARY KEY (id);

2.1 rollback

- Ends the transaction (结束事务)
- Undoes all changes in the current transaction(撤销当前事务所有的改动) 
- Erases all savepoints in the transaction (清除事务中的所有保存点)
- Releases any transaction locks (释放所有事务锁)
DECLARE
BEGIN
   INSERT INTO stu_info (id, NAME, sex) VALUES (1, '瑶瑶', '女');
   INSERT INTO stu_info (id, NAME, sex) VALUES (2, '悠悠', '女');
   rollback;
END;

运行结果:
在这里插入图片描述

2.2 rollback to savepoint xx

  • 回滚到指定的回滚点 xx
  • 若回滚点同名,则回滚至最近的一个回滚点(不建议同名,不方便排查问题)
DECLARE
BEGIN
   INSERT INTO stu_info (id, NAME, sex) VALUES (1, '瑶瑶', '女');
   SAVEPOINT sp1;
   
   INSERT INTO stu_info (id, NAME, sex) VALUES (2, '悠悠', '女');
   SAVEPOINT sp2; -- 若也是 ps1,则回滚至此处(最近)
   
   -- 模拟报错,违反唯一性约束
   INSERT INTO stu_info (id, NAME, sex) VALUES (2, '倩倩', '女');
   SAVEPOINT sp3;
   
   COMMIT;
EXCEPTION 
  WHEN OTHERS THEN
    ROLLBACK TO sp2;
    dbms_output.put_line(dbms_utility.format_error_backtrace); -- 报错的行数
    dbms_output.put_line(SQLCODE ||' : ' || SQLERRM);
    COMMIT;
END;

运行结果:
在这里插入图片描述

2.3 rollback work force ‘string’

  • 下面的语句手工回滚一个有疑问的分布式事务
-- 查询
select * from dba_2pc_pending;

-- 回滚
rollback work force '25.32.87';

你可能感兴趣的:(Oracle 回滚详解(rollback))