在前一篇文章中提到ANSI定义的事务隔离级别标准(http://blog.csdn.net/u010415792/article/details/8977635),但各个厂商实现的方式却不尽相同,本文主要介绍Oracle实现的事务隔离级别,Oracle所有的隔离等级都依赖于undo,隔离级别越高,出现ORA-01555错误的可能性越大。
1、Read committed (Default)
Oracle最低的隔离级别是Read committed,它有如下特性:
- 这是ORACLE缺省的事务隔离级别。
- 事务中的每一条语句都遵从语句级的读一致性。
- 保证不会脏读;但可能出现非重复读和幻像。
可能有些人会奇怪,Oracle最低的隔离级别怎么不是Read uncommitted呢?因为Oracle有undo,它天生就是读写不阻塞,因此在Oracle里,根本就不会出现脏读。
这里解释一下什么是“语句级的读一致性”,它是指
当一条语句开始执行时,它既能看到本事务之前对数据的影响,也能看到语句开始执行时已提交事务对数据的影响。看下面这个例子:
1) 清空测试表数据:
SQL> delete from test;
1 row deleted.
SQL> commit;
Commit complete.
2) 设置session1的隔离级别为Read committed:
Session1> alter session set isolation_level=read committed;
Session altered.
3) 在session1中插入一条数据(未提交):
SQL> delete from test;
1 row deleted.
SQL> commit;
Commit complete.
2) 设置session1的隔离级别为Read committed:
Session1> alter session set isolation_level=read committed;
Session altered.
3) 在session1中插入一条数据(未提交):