关于oralce的事务隔离级别

首先,先了解一下事务隔离级别的相关概念:

 

事务隔离级别:一个事务对数据库的修改与并行的另一个事务的隔离程度。

两个并发事务同时访问数据库表相同的行时,可能存在以下三个问题:

1、幻想读:事务T1读取一条指定where条件的语句,返回结果集。此时事务T2插入一行新记录,恰好满足T1的where条件。然后T1使用相同的条件再次查询,结果集中可以看到T2插入的记录,这条新纪录就是幻想。

2、不可重复读取:事务T1读取一行记录,紧接着事务T2修改了T1刚刚读取的记录,然后T1再次查询,发现与第一次读取的记录不同,这称为不可重复读。

3、脏读:事务T1更新了一行记录,还未提交所做的修改,这个T2读取了更新后的数据,然后T1执行回滚操作,取消刚才的修改,所以T2所读取的行就无效,也就是脏数据。

 

oracle只有两种事务隔离级别,而SQL标准定义了四种事务隔离级别

以下是sql标准定义的:

READ UNCOMMITTED 幻想读、不可重复读和脏读都允许。

READ COMMITTED 允许幻想读、不可重复读,不允许脏读

REPEATABLE READ 允许幻想读,不允许不可重复读和脏读

SERIALIZABLE 幻想读、不可重复读和脏读都不允许

 

oracle:

READ COMMITTED 允许幻想读、不可重复读,不允许脏读

SERIALIZABLE 幻想读、不可重复读和脏读都不允许

 

得出一个结论,oracle是不允许脏读的。通过命令的方式你也可以知道oracle事务隔离级别

set transaction isolation level read uncommitted

ORA-02179: valid options: ISOLATION LEVEL { SERIALIZABLE | READ COMMITTED }

提示uncommitted无效,而有效的很明显只有两种事务隔离级别.默认的是read committed级别。

 

另外还有一点需要注意的是,在oracle的一个事务中,如果你update了一条数据,在没有提交的情况下,然后再select这条数据,你会查询出刚刚update的值。这个时候如果有并发的一个事务,那么他取到的还是update之前的值,因为之前的那个事务并没有提交。

 

我觉得一般来说read committed就已经可以了,至于出现幻想读和不可重复读,对于一般应用而言,也没有什么。而如果用serializable串行的话,对并发的影响会更大,性能也会相对降低。

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值