PLSQL总结——16.自治事务

/*
  我们应该知道,当一个PL/SQL块中出现异常时,Oracle数据库不会回滚这个块中的DML语句的修改。
  这时候我们需要手动rollback

  在写代码的时候,我们不会在被调用的过程写commit。因为一般环境下,外部发生异常,我们都希望进行回滚数据。
  假如被调用的过程写了commit,内部的DML就不会回滚,而且还影响到外部的DML。
*/

--1.创建表
  create table tb_error
 (
    id number,
    error_msg varchar2(20)
  );
  
--2.创建过程
create or replace procedure auto_transaction is
   --pragma autonomous_transaction;
begin
    insert into tb_error values (2,'test error!');
    commit;
end;


--3.调用过程
declare
    a number;
begin
    insert into tb_error values(1,'test');
    auto_transaction;
    a := 'a';
    dbms_output.put_line(a);
exception
    when others then
        rollback;--希望把 insert into tb_error values(1,'test')回滚。而auto_transaction的DML保存。
end;
/*
  这时,我们运行代码3的时候,发现tb_error存在insert into tb_error values(1,'test')这条记录。当然id为2的也插进来了
  这并不是我的目的。
  因为auto_transaction影响了外部的事物。所以为了把他独立开来,我们必须使用自治事物。
  把代码2的pragma autonomous_transaction注释去掉重新编译,再运行代码3。我们发现实现了目的。
  tb_error只有id为2的记录。
*/


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值