ORACLE事物隔离级别

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  
插入数据出错。  

这种级别很少用到。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值