Oracle基礎 存儲過程和事務


一、事務和存儲過程

  在存儲過程中如何使用事務。當需要在存儲過程中同時執行多條添加、修改、刪除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、自主事務處理可以啟動其它自主事務處理。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM