PLSQL Language Referenc-PL/SQL靜態SQL-自治事務(二)

LuiseDalian發表於2014-03-17

事務上下文

主事務與巢狀程式共享它的上下文,但不與自治事務共享上下文。當一個自治程式呼叫另一個程式或遞迴呼叫,則程式不會共享事務上下文;當一個自治程式呼叫另一個非自治程式,則程式共享相同的事務上下文。

事務可見性

當自治事務提交時,自治事務所做的改變可以被其它事務看到。

如果隔離級別設定的為READ COMMIT(預設),則當主事務再次繼續時,自治事務中的改變對於主事務是可見的;如果將主事務的隔離級別設定為SERIALIZABLE,則當主事務再次繼續時,自治事務中的改變對於主事務是不可見的

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

注意:事務屬性只作用於設定它的事務。游標屬性不被自治事務影響。

宣告自治事務

宣告自治事務,使用AUTONOMOUS_TRANSACTION

技巧:雖然這個編譯指示可以被放在宣告的部分的任何地方,但一般放在最頂端。

不能對整個包或ADT應用AUTONOMOUS_TRANSACTION編譯指示,但可以把它應用到包的每個子程式或ADT的每個方法上。

--在包中宣告自治函式

CREATE OR REPLACE PACKAGE emp_actions AS

    FUNCTION raise_salary (emp_id NUMBER, sal_raise NUMBER)

    RETURN NUMBER;

END emp_actions;

/

CREATE OR REPLACE PACKAGE BODY emp_actions AS 

    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;

 

--宣告自治的單獨的過程

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;

 

--宣告自治PL/SQL

DROP TABLE emp;

CREATE TABLE emp AS SELECT * FROM employees;

 

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;

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/17013648/viewspace-1122931/,如需轉載,請註明出處,否則將追究法律責任。

相關文章