主事务与嵌套程序共享它的上下文,但不与自治事务共享上下文。当一个自治程序调用另一个程序或递归调用,则程序不会共享事务上下文;当一个自治程序调用另一个非自治程序,则程序共享相同的事务上下文。
当自治事务提交时,自治事务所做的改变可以被其它事务看到。
如果隔离级别设置的为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博客 ” ,链接:https://blog.itpub.net/17013648/viewspace-1122931/ ,如需转载,请注明出处,否则将追究法律责任。