父存儲過程能否回滾子過程已經提交的數據?
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” 的數據。
結論:父過程回滾了子進程的操作。