Oracle数据库的事务隔离级别

jopen 10年前

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

l 未提交读(read uncommitted

l 提交读(read committed

l 重复读(repeatable read

l 序列化(serializable

      也就是隔离级别,0123ANSI/ISO SQL92标准有很详细的说明

      隔离级别0与事务无关,并且不加锁,也就是说例如select * from t1,系统扫描过和读取的每一行都不加锁。

      隔离级别1与事务无关,只对正在取数的行加锁,取完数马上开锁,也就是说,begin tran 然后select * from t1即使没有commit,锁也会自动打开。

      隔离级别2与事务有关,对扫描过的地方加锁。例如,select * from t1,系统从第1行开始扫描,扫描到第5行的时候,15行都处于锁定状态,直到commit,这些锁才解开。

      隔离级别3与事务有关,对全表加锁。

2、各种隔离级别出现的现象

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

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

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

非重复读(nonrepeatable read):同一查询在同一事务中多次进行,由于其他提交事务所做的修改或删除,每次返回不同的结果集,此时发生非重复读。

幻读(phantom read):同一查询在同一事务中多次进行,由于其他提交事务所做的插入操作,每次返回不同的结果集,此时发生幻像读。 

3Oracle数据库的三种隔离级别

1). Read committed

       该隔离级别不允许脏读,也不允许重复读(即再次读取时可能会与原来的值不一样),并且允许幻像读(即再次读取时新增的数据可以读取到).

      这里的重复读和幻像读均是oracle在其内部的一种实现机制,正常我们执行select,再执行select不能算做重复读或幻像读,只是在oracle内部由于某种原因,在我们执行select 操作后,oracle在内部帮我们从数据块中读取数据时,读取到一部分,发生了一些oracle认为有必要重新进行获取的机制时,需要重头开始读取数据,这时的读称为重复读!

2).serialable

      该隔离级别要求同一会话session中的事务是序列化的,一般都不会用到这种隔离级别.

3).read Only

      即事务是只读的, 不允许update deleteinsert操作.