本文小节了oracle中事务隔离级别。 
 
ANSI SQL标准定义了4中隔离级别: 
READ UNCOMMITTED  
READ COMMITTED  
REPEATABLE READ  
SERIALIZABLE 
 
隔离级别允许或不允许的3种现象 
Dirty read(脏读):能读到未提交的数据。 
Nonrepeatable read(不可重复读):可能会出现丢失更新。 
Phantom read(幻像读): 已读的数据不会改变,和以前相比,可能会有更多满足条件的数据。 
 
ANSI隔离级别 
隔离级别                             脏读          不可重复读       幻像读 
READ UNCOMMITTED        允许           允许               允许 
READ COMMITTED            不允许        允许               允许 
REPEATABLE READ           不允许        不允许           允许 
SERIALIZABLE                 不允许        不允许           不允许 
 
以下部分测试例子。 
 
1、READ UNCOMMITTED  
允许脏读,不可重复读和幻像读。这里想更改隔离级别,直接报错。 
 
SQL> SET TRANSACTION  ISOLATION LEVEL  READ UNCOMMITTED; 
SET TRANSACTION  ISOLATION LEVEL  READ UNCOMMITTED 
                                       * 
ERROR at line 1: 
ORA-02179: valid options: ISOLATION LEVEL { SERIALIZABLE | READ COMMITTED } 
 
2、READ COMMITTED  
oracle的默认隔离选项。事务只能读取数据库中已经提交的数据。不允许脏读。 
session 1: 
SQL> conn test/test 
Connected. 
SQL> SET TRANSACTION  
  2  ISOLATION LEVEL  
  3  READ COMMITTED; 
Transaction set. 
 
SQL> select * from t; 
         X 
---------- 
         1 
 
session 2: 
SQL> conn test/test 
Connected. 
SQL> SET TRANSACTION  
  2  ISOLATION LEVEL  
  3  READ COMMITTED; 
 
Transaction set. 
 
SQL>  select * from t; 
         X 
---------- 
         1 
 
session 1: 
SQL> update t set x=2; 
 
1 row updated. 
 
SQL> insert into t values (3); 
 
1 row created. 
 
SQL> commit; 
 
Commit complete. 
 
SQL> select * from t; 
         X 
---------- 
         2 
         3 
 
session 2: 
 
SQL> select * from t; 
         X 
---------- 
         2 
         3 
 
==>验证了允许不可重复读和幻象读。 
 
3、REPEATABLE READ 
 
能给出一正确的结果,避免丢失更新。即不允许脏读和重复读,允许幻读。 
 
4、SERIALIZABLE 
最高程度的隔离性。即不允许脏读,不可重复读和幻读。 
 
session 1; 
 
SQL> select * from t; 
        X 
---------- 
         1 
 
session2: 
 
SQL> select * from t; 
         X 
---------- 
         1 
 
SQL> SET TRANSACTION  
  2  ISOLATION LEVEL SERIALIZABLE; 
Transaction set. 
 
SQL>  select * from t; 
         X 
---------- 
         1 
session1: 
SQL> insert into t values (2); 
1 row created. 
SQL> commit; 
Commit complete. 
 
SQL> select * from t; 
         X 
---------- 
         1 
         2 
 
session 2: 
SQL>  select * from t; 
         X 
---------- 
         1 
SQL> update t set  x=2; 
update t set  x=2 
       * 
ERROR at line 1: 
ORA-08177: can't serialize access for this transaction 
 
==》自事务后,session1又添加了一行为2记录,session2更改报错。 
 
总结: 
1.oracle只允许隔离级别更改为SERIALIZABLE和READ COMMITTED,默认为READ COMMITTED。 
2.设置为最高级别的隔离选项(SERIALIZABLE)后,可能会在事务内遇到ORA-08177。 
 
end; 
 
 
 
    免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。