Oracle基礎 存儲過程和事務

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;

 

  總結自主事務:數據

  一、自主事務處理結果的變化不依賴於主事務處理的狀態或最終配置。存儲過程

  二、自主事務處理提交或回滾時,不影響主事務處理的結果。

  三、自主事務提交一旦提交,該自主事務處理結果的變化對於其餘事務處理就是課件的。這意味着,用於能夠訪問已更新的信息,無需等待主事務處理提交。

  四、自主事務處理能夠啓動其它自主事務處理。

相關文章
相關標籤/搜索