oracle 父存儲過程調用子過程的事務問題

原鏈接:http://www.itpub.net/viewthread.php?tid=1231296&extra=&page=1 

 

父存儲過程能否回滾子過程已經提交的數據?

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” 的數據。

結論:父過程回滾了子進程的操作。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章