数据级别[Oracle] 事务隔离级别(Oracle的实现方式)

本文是一篇关于数据级别的帖子

    在前一篇文章中提到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中插入一条数据(未提交):
Session1> insert into test values(1);

1 row created.
4) 在session1查询:
SQL> select * from test;

        ID
----------
         1
在session1中可以看到本事务之前插入的数据。
5) 在session2中插入一条数据并提交:
Session2> insert into test values(2);

1 row created.

Session2> commit;

Commit complete.
6) 在session1中查询:
Session1> select * from test;

        ID
----------
         2
         1
在session1中可以看到session2中已提交的数据。

    在该断绝级别中,只要其它事务提交(即时其它事务在本事务以后才开始),也能看到其它事务对数据操纵的结果,因此它不能阻止非重复读和幻读。

    

    

2、Serializable

    Oracle的下一个级别不是Repeatable Read,而是Serializable,它又如下特性:

    

  •  简略地说,serializable就是使事务看起来象是一个接着一个地顺序地执行。
  • 仅仅能看见在本事务开始前由其它事务提交的变动和在本事务中所做的变动(事务级的一致性)。
  • 保障不会出现非重复读和幻像。
  • Serializable断绝级别供给了read-only事务所供给的读一致性(事务级的读一致性),同时又答应DML操纵。

    所谓“事务级的一致性”是指通过这种断绝级别,查询的结果已经在事务启动的时候确定,事务启动后其它事务对数据的转变,对本事务的查询没有影响。看下面例子:

    1) 清空测试表数据:
SQL> delete from test;

2 rows deleted.

SQL> commit;

Commit complete.

2) 设置session1的断绝级别为Serializable:
Session1> alter session set isolation_level=serializable;

Session altered.

    每日一道理
水仙亭亭玉立,兰花典雅幽香,牡丹雍容华贵,梨花洁白无暇……美丽的花朵总能得到世人的羡慕与赞叹,殊不知,它从一粒小小的种子到最后开花,要历经无数的艰辛与坎坷!我们的成长也是如此。只有做辛勤的“织梦者”,我们的梦想才会成真!

    3) 在session1中插入数据(未提交):
Session1> insert into test values(1);

1 row created.
4) 在session1中查询:
Session1> select * from test;

        ID
----------
         1
在session1中可以看到本事务之前插入的数据。
5) 在session2中插入一条数据并提交:
Session2> insert into test values(2);

1 row created.

SQL> commit;

Commit complete.
6) 在session1中查询:
Session1> select * from test;

        ID
----------
         1

在session1中无法看到session2中插入的数据。

    

    

3、Read Only

    

 

  •  遵从事务级的读一致性,仅仅能看见在本事务开始前由其它事务提交的变动。
  • 不答应在本事务中进行DML操纵。
  • read only是serializable的子集。它们都避免了非重复读和幻像。区别是在read only中是只读;而在serializable中可以进行DML操纵。

 

Read only和Serializable类似,独一不同的是它不答应在本事务中进行DML操纵,见下面例子:

    


    

1) 清空测试表数据:
SQL> delete from test;

1 row deleted.

SQL> commit;

Commit complete.

2) 设置session1的断绝级别为Read Only:
Session1> SET TRANSACTION READ ONLY;

Transaction set.

3) 尝试在session1中插入数据:
Session1> insert into test values(1);
insert into test values(1)
*
ERROR at line 1:
ORA-01456: may not perform. insert/delete/update operation inside a READ ONLY
transaction
插入数据出错。

    


    

这种级别很少用到。

    

文章结束给大家分享下程序员的一些笑话语录: 问:你觉得让你女朋友(或者任何一个女的)从你和李彦宏之间选一个,你觉得她会选谁?  
  答:因为李艳红这种败类,所以我没女友!

--------------------------------- 原创文章 By
数据和级别
---------------------------------

posted @ 2013-05-27 19:52  xinyuyuanm  阅读(642)  评论(0编辑  收藏  举报