1、事務和存儲過程spa
在存儲過程當中如何使用事務。當須要在存儲過程當中同時執行多條添加、修改、刪除SQL語句時,爲了保證數據完整性,咱們須要使用事務。使用方式和在PL-SQL中很是類似,但也有一些區別。 code
--帶事務的存儲過程 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;
調用事務blog
SELECT * FROM ACCOUNT; DECLARE fromuser NUMBER := 1; touser NUMBER := 2; money NUMBER := &m; BEGIN account_zhuanzhang(fromuser,touser,money); END;
2、自主事務處理:事務
自主事務:是由零一個事務啓動的獨立事務處理。自主事務處理能夠暫停主事務處理,也就是處理本身存儲過程內部的事務,當自主事務處理完以後會恢復主事務處理。class
PRAGMA AUTONOMOUS_TRANSACTION; --定義爲自主事務,不受其餘事務提交,回滾的影響test
例:配置
--自主事務:帶參數添加部門信息,最後使用了回滾 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;
總結自主事務:數據
一、自主事務處理結果的變化不依賴於主事務處理的狀態或最終配置。存儲過程
二、自主事務處理提交或回滾時,不影響主事務處理的結果。
三、自主事務提交一旦提交,該自主事務處理結果的變化對於其餘事務處理就是課件的。這意味着,用於能夠訪問已更新的信息,無需等待主事務處理提交。
四、自主事務處理能夠啓動其它自主事務處理。