【前言】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 的自治事务
最新推荐文章于 2025-07-21 19:59:26 发布
本文介绍如何在Oracle存储过程中使用自治事务来记录日志并提交,同时允许主存储过程回滚,以此实现更灵活的事务控制。
896

被折叠的 条评论
为什么被折叠?



