Oracle数据库的事务隔离级别
1、ANSI/ISO SQL92标准定义了一些数据库操作的隔离级别:
l 未提交读(read uncommitted)
l 提交读(read committed)
l 重复读(repeatable read)
l 序列化(serializable)
也就是隔离级别,0,1,2,3。ANSI/ISO SQL92标准有很详细的说明
隔离级别0与事务无关,并且不加锁,也就是说例如select * from t1,系统扫描过和读取的每一行都不加锁。
隔离级别1与事务无关,只对正在取数的行加锁,取完数马上开锁,也就是说,begin tran 然后select * from t1即使没有commit,锁也会自动打开。
隔离级别2与事务有关,对扫描过的地方加锁。例如,select * from t1,系统从第1行开始扫描,扫描到第5行的时候,1到5行都处于锁定状态,直到commit,这些锁才解开。
隔离级别3与事务有关,对全表加锁。
2、各种隔离级别出现的现象
通过一些现象,可以反映出隔离级别的效果。这些现象有:
更新丢失(lost update):当系统允许两个事务同时更新同一数据是,发生更新丢失。
脏读(dirty read):当一个事务读取另一个事务尚未提交的修改时,产生脏读。
非重复读(nonrepeatable read):同一查询在同一事务中多次进行,由于其他提交事务所做的修改或删除,每次返回不同的结果集,此时发生非重复读。
幻读(phantom read):同一查询在同一事务中多次进行,由于其他提交事务所做的插入操作,每次返回不同的结果集,此时发生幻像读。
3、Oracle数据库的三种隔离级别
1). Read committed
该隔离级别不允许脏读,也不允许重复读(即再次读取时可能会与原来的值不一样),并且允许幻像读(即再次读取时新增的数据可以读取到).
这里的重复读和幻像读均是oracle在其内部的一种实现机制,正常我们执行select后,再执行select不能算做重复读或幻像读,只是在oracle内部由于某种原因,在我们执行select 操作后,oracle在内部帮我们从数据块中读取数据时,读取到一部分,发生了一些oracle认为有必要重新进行获取的机制时,需要重头开始读取数据,这时的读称为重复读!
2).serialable
该隔离级别要求同一会话session中的事务是序列化的,一般都不会用到这种隔离级别.
3).read Only
即事务是只读的, 不允许update 和delete和insert操作.