ORACLE的隔离级别-实用经典版-(isolation level)

来源:互联网 发布:spc数据自动生成 编辑:程序博客网 时间:2024/05/16 01:42

ORACLE的隔离级别

 

 全球第一款网络点验钞机诞生在浙江温州 ,点钞机/网络点钞机,通过客户端维融金网卫士连接网络,云存储数据和网络验钞

隔离级别(isolation level

SQL92标准定义:

 

u 隔离级别定义了事务与事务之间的隔离程度。

u 隔离级别与并发性是互为矛盾的.隔离程度越高,数据库的并发性越差;隔离程度越低,数据库的并发性越好。

u ANSI/ISO SQL92标准定义了一些数据库操作的隔离级别:

n 未提交读(read uncommitted

n 提交读(read committed

n 重复读(repeatable read

n 序列化(serializable

u 通过一些现象,可以反映出隔离级别的效果。这些现象有:

n 更新丢失(lost update):当系统允许两个事务同时更新同一数据是,发生更新丢失。

n 脏读(dirty read):当一个事务读取另一个事务尚未提交的修改时,产生脏读。

n 非重复读(non-repeatable read):同一查询语句在同一事务中多次进行,如果这个过程中其他事务提交了所做的修改或删除,会发生每次返回不同的结果集,此时发生非重复读。

u 幻象(phantom read):同一查询语句(查询条件都一样)在同一事务中多次进行,由于其他事务提交了所做的插入操作,有可能这些插入的的数据符合该查询语句的查询条件,那么每次返回不同的结果集,此时发生幻象读。

下面是隔离级别及其对应的可能出现或不可能出现的现

ISOLATION LEVEL

Dirty Read

Non-repeatable Read

Phantom Read

Read uncommitted

Possible

Possible

Possible

Read committed

Not possible

Possible

Possible

Repeatable read

Not possible

Not possible

Possible

Serializable

Not possible

Not possible

Not possible

 

 

ORACLE的隔离级别

 

l        提供目前ORACLE支持三种隔离界别。ORACLE提供了SQL92标准中的read committedserializable,同时提供了非SQL92标准的read-onlyOracle默认的隔离级别是read committed

read committed (DEFAULT):读提交

l        这是ORACLE缺省的事务隔离级别。

l        事务中的每一条语句都遵从语句级的读一致性。

l        保证不会脏读;但可能出现非重复读和幻像。

 

ORACLE隔离级别(Isolation level-serializable:序列化

u serializable,顾名思义,序列化的,就是使事务看起来像是一个接着一个地顺序地执行。

u 仅仅能看见在本事务开始前由其它事务提交的更改和在本事务中所做的更改。

u 保证不会出现非重复读和幻象

u Serializable隔离级别提供了read-only事务所提供的读一致性(事务级的读一致性),同时又允许DML操作。

u 如果一个serializable事务包含有对数据的DML操作,尝试去修改别的事务在它开始之前已经修改还没有提交的数据,并且这个serializable的事务没有回滚,那么它会报一个错:ORA-08177: Cannot serialize access for this transaction也就是说如果有一个A事务(没有具体类型)做了些DML操作,更新了一些数据,还没提交,这是一个Bserializable)事务开始,在事务中B事务对A事务更新过的一些数据做了DML操作,那么如果提交了,Bserializable事务就会报错,如果B事务回滚了则不会报错。

u ORACLE在数据块中记录最近对数据行执行修改操作的N个事务的信息,目的是确定是否有在本事务开始时未提交的事务修改了本事务将要修改的行。具体见英文:

[ORACLE隔离级别(Isolation level-read-only]:只读

u  遵从事务级的读一致性,仅仅能看见在本事务开始前由其它事务提交的更改。

u  不允许在本事务中进行DML操作

u  read onlyserializable的子集。它们都避免了非重复读和幻像。区别是在read only中是只读;而在serializable中可以进行DML操作。

u  Export with CONSISTENT = Y sets the transaction to read-only.

 

ORACLE read committedserializable的区别和关系

【同点】read committed(A) and serializable(B)事务都是用row-level锁,如果他们想要修改一行数据,而这行数据已经被另外事务(C,D…)修改但还没提交,他们都会等待另外事务提交或者回滚以释放资源。如果另外的事务回滚释放了资源,他们都可以停止等待继续进行下去修改这行数据。【不同点】如果另外的事务提交了这行的修改并释放了资源,read committed(A) 事务将会停止等待继续这行数据修改,但是serializable(B)事务将会失败并抛出错误"Cannot serialize access"。因为另外的事务提交 在serializable(B)之前做的修改。

 

【例子】事务1先于事务2开始,并保持未提交状态。事务2想要修改被事务1修改的行。事务2等待。如果事务1回滚,则事务2(不论是read committed还是serializable方式)停止等待继续进行它想要做的修改。如果事务1提交,则当事务2read committed方式时,进行它想要做的修改;当事务2serializable方式时,失败并报错“Cannot serialize access”,因为事务2看不见事务1提交的修改,且事务2想在事务一修改的基础上再做修改。

read committedserializable可以在ORACLE并行服务器中使用。

 

关于SET TRANSACTION READ WRITE

read writeread committed应该是一样的。在读方面,它们都避免了脏读,但都无法实现重复读。虽然没有文档说明read write在写方面与read committed一致,但显然它在写的时候会加排他锁以避免更新丢失。在加锁的过程中,如果遇到待锁定资源无法锁定,应该是等待而不是放弃。这与read committed一致。

ORACLE语句级的读一致性】

u ORACLE保证语句级的读一致性,即一个语句所处理的数据集是在单一时间点上的数据集,这个时间点是这个语句开始的时间

u 一个语句看不见在它开始执行后提交的修改。

u 对于DML语句,它看不见由自己所做的修改,即DML语句看见的是它本身开始执行以前存在的数据。

 

【事务级的读一致性】

u 事务级的读一致性保证了可重复读,并保证不会出现幻象。

 

【设置隔离级别】

设置一个事务的隔离级别

u SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

u SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

u SET TRANSACTION READ ONLY;

u  

设置一个会话的隔离级别

u ALTER SESSION SET ISOLATION_LEVEL SERIALIZABLE;

u ALTER SESSION SET ISOLATION_LEVEL READ COMMITTED;