Oracle基礎 存儲過程和事務

 

轉自: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、自主事務處理可以啓動其它自主事務處理。

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