【前言】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; 这样就能实现以上功能。
【hello world!】Oracle 的自治事务
最新推荐文章于 2024-07-12 16:41:26 发布