Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2838901
  • 博文数量: 599
  • 博客积分: 16398
  • 博客等级: 上将
  • 技术积分: 6875
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-30 12:04
个人简介

WINDOWS下的程序员出身,偶尔也写一些linux平台下小程序, 后转行数据库行业,专注于ORACLE和DB2的运维和优化。 同时也是ios移动开发者。欢迎志同道合的朋友一起研究技术。 数据库技术交流群:58308065,23618606

文章分类

全部博文(599)

文章存档

2014年(12)

2013年(56)

2012年(199)

2011年(105)

2010年(128)

2009年(99)

分类: Oracle

2010-02-08 14:11:10

自治事物中的父事物能否看见子事物对数据的变更,取决于父事务的隔离级别。
对于使用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 过程已成功完成。
 
阅读(1458) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~