[Oracle] 事务隔离级别(Oracle的实现方式)
2013-05-27 14:41
190 查看
在前一篇文章中提到ANSI定义的事务隔离级别标准(http://blog.csdn.net/u010415792/article/details/8977635),但各个厂商实现的方式却不尽相同,本文主要介绍Oracle实现的事务隔离级别,Oracle所有的隔离等级都依赖于undo,隔离级别越高,出现ORA-01555错误的可能性越大。
这是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中已提交的数据。
在该隔离级别中,只要其它事务提交(即时其它事务在本事务之后才开始),也能看到其它事务对数据操作的结果,因此它不能阻止非重复读和幻读。
简单地说,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中插入的数据。
不允许在本事务中进行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
插入数据出错。
这种级别很少用到。
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
插入数据出错。
这种级别很少用到。
相关文章推荐
- 数据级别[Oracle] 事务隔离级别(Oracle的实现方式)
- MySQL和Oracle分页查询实现方式
- 统计查询-根据条件进行count的两种实现方式- oracle
- oracle 创建字段自增长实现方式
- 基于Oracle,采用JDBC、Hibernate不同方式实现自定义序列主键生成
- oracle中自增长列的实现方式
- Oracle中“行转列”的实现方式
- oracle中分页的实现方式.rownum的使用
- Oracle 动态sql 实现方式
- Oracle中“行转列”的实现方式
- Mybatis Generator的model生成中文注释,支持oracle和mysql(通过修改源码的方式来实现)
- Oracle 数据库的连接方式实现方法
- PostgreSQL、Oracle/MySQL和SQL Server的MVCC实现原理方式
- Oracle外部表有哪些实现方式?每种实现方式如何实现?
- 本文通过举例的方式来教你如何在Oracle中实现SELECT TOP N的方法(转)
- Oracle学习之路-- 案例分析实现行列转换的几种方式
- Oracle实现自增方式:序列+触发器
- Oracle如何实现创建数据库、备份数据库及数据导出导入的一条龙操作-------sql方式
- 本文通过举例的方式来教你如何在Oracle中实现SELECT TOP N的方法(转)
- Oracle很实用的汇总报表实现方式!grouping_id、rollup的使用