【hello world!】Oracle 的自治事务

来源:互联网 发布:网络词99是什么意思啊 编辑:程序博客网 时间:2024/05/22 17:10
【前言】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; 这样就能实现以上功能。