父存储过程能否回滚子过程已经提交的数据?
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” 的数据。
结论:父过程回滚了子进程的操作。
该贴由chong.zhang转至本版2014-9-18 12:34:59