oracle 父存储过程调用子过程的事务问题

父存储过程能否回滚子过程已经提交的数据?

create table TEST1
(
  C1 VARCHAR2(100)
)
alter table TEST1
  add constraint key1 primary key (C1);

CREATE OR REPLACE PROCEDURE testp1 IS
BEGIN
  INSERT INTO test1 (c1) VALUES ('11');
  COMMIT;
END testp1;

CREATE OR REPLACE PROCEDURE testp3 IS
BEGIN
  testp1;
  testp1;     --违反主键约束,一定会出现异常。
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
RAISE;
END testp3;

执行:exec testp3;
结果:表中有一行数据  “11”

完全一样的测试,在SQL Server中的结果就是没有数据被插入。

==================================================================

SQL SERVER的自动提交是个恶习,在ORACLE中写不会阻塞读,因此一个事务该持续多久就多久。

存储过程中不应该有事务控制,提交或回滚都应该交给客户端去完成,
http://www.itpub.net/thread-1177121-3-8.html

见#29.

==================================================================

处理:

oracle 中一个过程默认开启一个事务

但子过程不提交事务,可由父过程控制提交或回滚事务。

修改过程

CREATE OR REPLACE PROCEDURE testp1 IS
BEGIN
  INSERT INTO test1 (c1) VALUES ('12');
  ---COMMIT;  ---子过程中不提交事务
END testp1;

执行:exec testp3;
结果:无“12” 的数据。

结论:父过程回滚了子进程的操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值