【hello world!】Oracle 的自治事务

【前言】csdn注册n久了,博客一直一毛不长啊,今天先种点东西。不能让这块地浪费了啊。打算将工作学习中的点滴给记录下来,以供自己和来人参考。
大家多多支持评点啊。
【问题提出】
在存储过程执行过程中,发现数据有异常或者其他情况,我们需要回滚已经提交的dml语句,一般情况在使用java调用存储过程中是,相应的java框架
或者底层的jdbc都有事务控制的机制,可以在java中回滚事务。我们一般的做法是使存储过程返回一个异常值比如 -1,然后java程序里回滚事务。
当不想在java里修改,毕竟修改java文件需要重新部署,有一定局限性。用什么还能实现呢。使用rollback!,把部分事务的控制放在存储过程里。
但是rollback只能回滚commit 以前的数据。有人说了,一般存储过程不能写commit的,事务一般在java里提交啊,这样便于调试和使事务控制简单化啊
。但是虽然我的事务回滚了,但是我要依赖回滚前的数据,把回滚前的数据错误写入日志,这个时候,我希望我记录的日志能够提交,但是提交以后我还想
回滚事务,这个时候就有问题了,如果我在记录日志的B存储过程中commit,那么在我的主存储过程A中,再使用rollback,就会将我在B中commit之前的数据全部提交了。
怎么处理呢。
【问题解决】
在存储过程B中使用Oracle 自治事务
自治事务可以在单独的会话中执行,它的事务状态不会影响当前的住主事务(A 的事务),它也不会看到当前事务没有提交的修改。也就是说我们可以在B
中提交挥着回滚事务,并不会影响A中对数据的修改。
【实现】
PL/SQL的声明部分加上PRAGMA AUTONOMOUS_TRANSACTION
比如
CREATE OR REPLACE B AS
  PRAGMA AUTONOMOUS_TRANSACTION;
  BEGIN
         --记录日志
          commit;
      END;
这样我们就能在B 总提交事务,而在A中回滚事务
比如

CREATE OR REPLACE A AS
  BEGIN
         --do something
         B;
         IF(comdition) THEN ROLLBACK; END IF;
      END;
 这样就能实现以上功能。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值