轉自:https://www.cnblogs.com/zhengcheng/p/4217531.html
一、事務和存儲過程
在存儲過程中如何使用事務。當需要在存儲過程中同時執行多條添加、修改、刪除SQL語句時,爲了保證數據完整性,我們需要使用事務。使用方式和在PL-SQL中非常相似,但也有一些區別。
--帶事務的存儲過程 CREATE OR REPLACE PROCEDURE Account_zhuanzhang(fromuser NUMBER,touser NUMBER,money NUMBER) IS BEGIN UPDATE account SET balance = balance - money WHERE id = fromuser; UPDATE account SET balance = balance + money WHERE id = touser; COMMIT; EXCEPTION WHEN OTHERS THEN dbms_output.put_line('轉賬失敗'); ROLLBACK; END Account_zhuanzhang;
調用事務
SELECT * FROM ACCOUNT; DECLARE fromuser NUMBER := 1; touser NUMBER := 2; money NUMBER := &m; BEGIN account_zhuanzhang(fromuser,touser,money); END;
二、自主事務處理:
自主事務:是由零一個事務啓動的獨立事務處理。自主事務處理可以暫停主事務處理,也就是處理自己存儲過程內部的事務,當自主事務處理完之後會恢復主事務處理。
PRAGMA AUTONOMOUS_TRANSACTION; --定義爲自主事務,不受其他事務提交,回滾的影響
例:
--自主事務:帶參數添加部門信息,最後使用了回滾 CREATE OR REPLACE PROCEDURE PRO_DEPT_ADD(DEPTNO NUMBER,DNAME VARCHAR2,LOC VARCHAR2) AS PRAGMA AUTONOMOUS_TRANSACTION; --定義爲自主事務,不受其他事務提交,回滾影響 BEGIN INSERT INTO DEPT (DEPTNO, DNAME, LOC) VALUES (DEPTNO, DNAME, LOC); ROLLBACK; --自主事務回滾操作,不影響主事務。 END;
--主事務,添加部門信息,並調用帶參數的自主事務,自己本身提交 CREATE OR REPLACE PROCEDURE PRO_DEPT_ADD2 AS BEGIN INSERT INTO DEPT (DEPTNO, DNAME, LOC) VALUES (60, 'test1', 'test2'); PRO_DEPT_ADD(70, 'test', 'test'); --如果調用的事務回滾,如果不是自主事務當前存儲過程中插入數據也要一起回滾。但是添加了自主事務後,自主事務提交內容不會影響到當前存儲過程 COMMIT; END;
調用主事務:
BEGIN pro_dept_add2(); --調用完畢後,爲60的部門插入成功,但是爲70的部門信息回滾了。只有一條插入成功! END;
總結自主事務:
1、自主事務處理結果的變化不依賴於主事務處理的狀態或最終配置。
2、自主事務處理提交或回滾時,不影響主事務處理的結果。
3、自主事務提交一旦提交,該自主事務處理結果的變化對於其他事務處理就是課件的。這意味着,用於可以訪問已更新的信息,無需等待主事務處理提交。
4、自主事務處理可以啓動其它自主事務處理。