自治事物中的父事物能否看见子事物对数据的变更,取决于父事务的隔离级别。
对于使用READ COMMITTED事务的隔离级别,父事务能看见子事务对数据库的变更。
对于使用SERIALIZABLE事务的隔离级别,父事务看不见子事务对数据库的变更。
看看TOM大师的例子:
SQL> CREATE TABLE T( MSG VARCHAR2(100));
表已创建。
SQL> CREATE OR REPLACE PROCEDURE AUTO_PROC
2 AS
3 PRAGMA AUTONOMOUS_TRANSACTION;
4 BEGIN
5 INSERT INTO T VALUES('A row for you');
6 COMMIT;
7 END;
8 /
过程已创建。
SQL> CREATE OR REPLACE PROCEDURE PROC(READ_COMMMITTED IN BOOLEAN)
2 AS
3 BEGIN
4 IF (READ_COMMITTED) THEN
5 SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
6 ELSE
7 SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
8 END IF;
9 AUTO_PROC;
10 DBMS_OUTPUT.PUT_LINE('---------------');
11 FOR X IN (SELECT * FROM T) LOOP
12 DBMS_OUTPUT.PUT_LINE(X.MSG);
13 END LOOP;
14 DBMS_OUTPUT.PUT_LINE('---------------');
15 COMMIT;
16 END;
17 /
警告: 创建的过程带有编译错误。
SQL> SHOW ERRORS
PROCEDURE PROC 出现错误:
LINE/COL ERROR
-------- -----------------------------------------------------------------
4/4 PL/SQL: Statement ignored
4/8 PLS-00201: 必须声明标识符 'READ_COMMITTED'
SQL> L1
1* CREATE OR REPLACE PROCEDURE PROC(READ_COMMMITTED IN BOOLEAN)
SQL> C/MMM/MM
1* CREATE OR REPLACE PROCEDURE PROC(READ_COMMITTED IN BOOLEAN)
SQL> RUN
1 CREATE OR REPLACE PROCEDURE PROC(READ_COMMITTED IN BOOLEAN)
2 AS
3 BEGIN
4 IF (READ_COMMITTED) THEN
5 SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
6 ELSE
7 SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
8 END IF;
9 AUTO_PROC;
10 DBMS_OUTPUT.PUT_LINE('---------------');
11 FOR X IN (SELECT * FROM T) LOOP
12 DBMS_OUTPUT.PUT_LINE(X.MSG);
13 END LOOP;
14 DBMS_OUTPUT.PUT_LINE('---------------');
15 COMMIT;
16* END;
过程已创建。
SQL> SET SERVEROUT ON
SQL> EXEC PROC(TRUE);
---------------
A row for you
---------------
PL/SQL 过程已成功完成。
SQL> DELETE FROM T;
已删除 1 行。
SQL> COMMIT;
提交完成。
SQL> EXEC PROC(FALSE);
---------------
---------------
PL/SQL 过程已成功完成。
阅读(1500) | 评论(0) | 转发(0) |