【重要】Oracle自主事务Commit提交问题。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了【重要】Oracle自主事务Commit提交问题。相关的知识,希望对你有一定的参考价值。

create or replace procedure p1
is
--PRAGMA AUTONOMOUS_TRANSACTION; 非自主事务
begin
update class_01 set c_desc = '修改22' where c_id =2;
commit;
end;

create or replace procedure p2
is
begin
update class_01 set c_desc = '修改33' where c_id = '3';
p1;
rollback;
end;

begin
p2;
end;

这样调用的最终结果是过程P1与P2都修改成功。
问题是:P1并非自主事务,它的操作时依赖与主程序P2的,我在P2中做了回滚为什么还会提交成功!!!!
求解惑。。。万分感谢

1.自治事务是独立于父级事务的,
2.你的程序运行过程就可看出来,两个事务是同级的完整的,即在p1中将p2之前的修改语句提交了,所以Rollback不会对以提交的事务就行回滚,因为undo 段里已经没有undo 信息了
参考技术A 程序都是一步步来的,按你的写法一步步走就是应该都成功,改变你代码的逻辑
update class_01 set c_desc = '修改33' where c_id = '3';
update class_01 set c_desc = '修改22' where c_id =2;
commit;
rollback;
已经提交了没东西可回吧追问

1. 这个逻辑我清楚,但是按照Oracle自主程序的概念来说,非自主程序是需要依赖主程序的。

2. 我试过rollback加在子程序中,是生效的。

3. 能能不能说说你理解的自主程序。

追答

程序中事务一般都是自己控制好的,要么都成功要么都失败,你这样的没怎么接触过啊,自主程序没接触过

追问

不解释.

参考技术B P1 中删除commit就可以了吧 参考技术C 第一.pragma autonomous_transaction; 为什么前面还有二个-号....
第二.9i及以上才有这个功能?追问

1. '--'表示注释

2. 我用的是10G

追答

就是说嘛,注释了程序还会认为他是自主程序么.

追问

问题是非自住事务它同样可以提交?

Oracle-事务处理

如果多个更新操作要么同时完成,要么同时失败,这种可以用事务这一概念处理。

事务只针对于数据更新使用,只有DML的更新操作才存在有事务的支持。

Session(会话,表示唯一的一个登陆用户),每个Session都有独立的事务处理操作。

commit:事务提交,在没有执行commit之前,所有的更新操作都保存在缓存区

rollback:事务回滚,如果发现更新操作有问题,可以回复所有的更新操作

如果没有进行 commit 事务提交,就可以用 rollback 恢复数据。

 

死锁:

如果有多个session处理同一个数据,第二个session会等第一个session操作完毕(执行完commit或者rollback)后再执行。

 

以上是关于【重要】Oracle自主事务Commit提交问题。的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 事务操作(事务的回滚与提交)

Oracle事务和常用数据库对象

oracle--事物---

请问oracle commit以后还能再回滚吗,rollback必须写在commit之前吗

oracle 事务 数据伪列

ORA-06519: 检测到活动的自主事务并回滚