oracle資料庫自治事務的學習筆記

來源:互聯網
上載者:User

oracle自治事務是指的預存程序和函數可以自己處理內部事務不受外部事務的影響,用pragma autonomous_transaction來聲明。要建立一個自治事務,必須在匿名塊的最高層或者預存程序、函數、資料包或觸發器的定義部分中,使用PL/SQL中的PRAGMA AUTONOMOUS_TRANSACTION語句。
以下是使用自治事務的幾種情況:

(1)Declaring Autonomous Function in Package


CREATE OR REPLACE PACKAGE emp_actions AS
  -- package specification
  FUNCTION raise_salary(emp_id    NUMBER,
                        sal_raise NUMBER) RETURN NUMBER;
END emp_actions;
/
 
CREATE OR REPLACE PACKAGE BODY emp_actions AS
  -- package body
  -- code for function raise_salary
  FUNCTION raise_salary(emp_id    NUMBER,
                        sal_raise NUMBER) RETURN NUMBER IS
    PRAGMA AUTONOMOUS_TRANSACTION;
    new_sal NUMBER(8,2);
  BEGIN
    UPDATE employees
       SET salary = salary + sal_raise
     WHERE employee_id = emp_id;
    COMMIT;
    SELECT salary
      INTO new_sal
      FROM employees
     WHERE employee_id = emp_id;
    RETURN new_sal;
  END raise_salary;
END emp_actions;
/
(2)Declaring Autonomous Standalone Procedure

 

CREATE OR REPLACE PROCEDURE lower_salary(emp_id NUMBER,
                                         amount NUMBER) AS
  PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
  UPDATE employees
     SET salary = salary - amount
   WHERE employee_id = emp_id;
 
  COMMIT;
END lower_salary;
/
(3)Declaring Autonomous PL/SQL Block


DECLARE
  PRAGMA AUTONOMOUS_TRANSACTION;
  emp_id NUMBER(6) := 200;
  amount NUMBER(6, 2) := 200;
BEGIN
  UPDATE employees
     SET salary = salary - amount
   WHERE employee_id = emp_id;
 
  COMMIT;
END;
/
(4)Declaring Autonomous in Trigger


CREATE OR REPLACE TRIGGER log_sal
  BEFORE UPDATE OF salary ON emp
  FOR EACH ROW
DECLARE
  PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
  INSERT INTO log
    (log_id, up_date, new_sal, old_sal)
  VALUES
    (:old.employee_id, SYSDATE, :new.salary, :old.salary);
  COMMIT;
END;
自治事務可以嵌套,嵌套深度等只受init.ora參數transactions(同時並發的事務數,預設為sessions的1.1倍)制約。因為自治事務是與主事務(簡稱MT)相分離的,所以它不能檢測到被修改過的行的目前狀態。這就好像在主事務提交之前,它們一直處於單獨的會話裡,對自治事務來說,它們是停用。然而,反過來情況就不同了:主事務能夠檢測到已經執行過的自治事務的結果。
如果AT試圖訪問被MT控制的資源,可能有deadlock發生,Package不能被聲明為AT,只有package所擁有的function和procedure 才能聲明為AT。主事務與自治事務是完全不同的事務,因此無法共用鎖定等。結束一個自治事務必須提交一個commit、rollback或執行ddl,否則會產生Oracle錯誤ORA-06519: active autonomous transaction detected and rolled back 。儲存點無法在自治事務中復原到父事務中的一個儲存點,只能在內部使用儲存點。
可能遇到的錯誤:
ora-06519 – 檢查到活動自治事務,復原——退出自治事務時沒有提交、復原或ddl操作
ora-14450 – 試圖訪問正在使用的事務級暫存資料表
ora-00060 – 等待資源時檢查到死結

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.