ORACLE事务隔离级别

本文介绍了Oracle数据库中的事务及其ACID属性,详细讨论了不可重复读、幻读和脏读问题,并阐述了事务隔离级别的概念,包括read committed、serializable和read-only等,通过实例解释了不同隔离级别对数据库操作的影响。
摘要由CSDN通过智能技术生成

事务在所有的关系型数据库中都是一个非常非常非非常常重要的概念。

1.什么是事务

2.事务的acid属性

参见http://docs.oracle.com/database/121/CNCPT/transact.htm#CNCPT016

3.为什么会有事务隔离

由于数据库是多用户的,多用户同时使用数据库就会产生如下几个问题。

a.不可重复读(Nonrepeatable (fuzzy) reads

不可重复读就是如果如果小明经理在涨工资之前习惯性的看一下小明工资,第一次看是1500,经理觉得有点低,然后公司工资普调了并提交到数据库,这个时候,小明经理想再次确认一下小明工资(假定这次确认和之前的查看在同一个事务中),如果经理确认的时候查看到小明的工资是2000。那么这个就是不可重复度。


b.幻读(Phantom reads

人事部第一次查询公司有1000人,接着有一个新同事入职了,然后人事部再次查询(假定与第一次查询同属一个事务),结果返回的和上一次不一样,变成了1001人,这就是幻读。ps:不可重复读和幻读在某种程度上十分相似,oracle官方也没有给出明确的区别。只给了这么一句话,自己体会unlike in a fuzzy read the previously read data is unchanged

c.脏读(Dirty reads

顾名思义就是读到了脏数据。小明的工资是1500一个月,由于小明表现好,小明经理要给小明涨500,修改了了数据库里小明的工资,还没有提交的时候。如果公司这个时候来修改小明的工资,读到了2000.那么这个就是脏读。因为经理还没有提交之前,小明的工资不一定就是2000,万一经理后悔了,不给小明涨工资了呢?


4.事务隔离

其实为了解决或者说避免以上问题无非是加锁,但是我们知道加锁就会影响数据库的并发。而且不是所有业务场景都会出现以上三种问题,或者说考虑到数据库并发性,在业务上允许的情况下,允许以上问题某一种或某几种发生。那么就要使用不同级别的锁来解决上述问题。

oracle定义了四种事务隔离级别,每种隔离级别对应解决的问题如下:


原则上oracle或者其他数据库是不允许dirty read,所以read uncommitted是不会出现的。read committed 是oracle默认的事务隔离级别。

5.不同事务隔离级别实例

创建测试表create table read_test(fid number) 表中没有数据

read committed:已提交读是针对那些存在很少的事务冲突的数据库环境所设置的隔离级别。改级别是不能解决不可重复读和幻读的。实际效果是,在query之前所有其他事务提交的变更都可以被读到。

5.1.想测试表插入一条测试数据

5.2.update该数据不提交以便产生行锁,造成后面update该数据等待

update read_test set fid = 2 where fid = 1;

5.3.验证


insert into read_test values(4);
commit;

5.4.结果


read committed隔离级别会导致丢失更新,例子如下,使用oracle自带的hr schema




serializable isolation level:与read committed 类似,不过一旦事务开始不受其他事务影响。验证同上例,修改隔离级别即可。但是该级别可以避免丢失更新问题。









read-only:和serializable 一样。不过read-only隔离级别在事务中除了sys用户外,其他用户不允许update数据。所以就不会有ora-08177异常了。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值