oracle事务隔离级别

划分隔离级别的3种现象

ANSI/ISO SQL标准定义了4种事务隔离级别,具体为根据数据库是否会出现下列3种现象来区分的。

1.脏读(dirty read):事务A中读取到事务B中未提交的数据。
2.不可重复读(nonrepeatable read):在同一事务的不同时间点查询同一行数据,返回了预料外的被修改的数据。
3.幻读(phantom read):在同一事务的不同时间点进行同一查询,返回了额外的数据。

不可重复读与幻读比较容易记混,只要记住,不可重复读针对的是修改,而幻读是新增。

ANSI隔离级别
  • READ UNCOMMITTED(读未提交):允许全部3种情况
  • READ COMMITTED(读已提交):不允许脏读
  • REPEATABLE READ(可重复读):不允许不可重复读和脏读
  • SERIALIZABLE(序列化):全都不允许

在这里插入图片描述
oracle支持上述隔离级别中的READ COMMITTEDSERIALIZABLE,并且额外提供了一种级别READ ONLY(只读),相当于是无法使用ddl语句的SERIALIZABLE

READ UNCOMMITTED(读未提交)

READ UNCOMMITTED这一隔离级别的根本目标是获得非阻塞读,但是oracle中的多版本一致性特性天然的提供了这一特性,并且由于脏读本身就是一种缺陷,所以oracle根本不需要这一隔离级别。

READ COMMITTED(读已提交)

这是oracle中默认的隔离模式。READ COMMITTED的特点是不允许脏读,oracle通过多版本一致性来完成这一目的。
简单的解释一下:比如在修改时,很可能会在回滚段中额外存一份修改的信息,来记录那一行数据要做什么样的修改,记录一个SCN号(可以理解成一种时间戳),以及一些必要的信息。当另一个语句在进行查询时,它会额外的对回滚段中的数据进行检查,并根据其中的信息来逻辑的还原出正确的数据以完成查询。

REPEATABLE READ(可重复读)

REPEATABLE READ的特点是不允许重复读。oracle中重复读与幻读使用同样的处理方法,因此没有给出这种隔离模式。

SERIALIZABLE(序列化)

oracle在实现SERIALIZABLE时的原理与READ COMMITTED时相似,不同在于后者是语句级的,而这个是事务级的。可以理解成,在检查回滚段时,会额外检查事务相关的信息。

最后,要注意的一点是,由于不同数据库使用了不同的并发机制与事务控制方法,在同一隔离机制下可能会产生不同的结果。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值