首页 > 编程知识 正文

数据库隔离级别 详解,事务隔离级别有哪些

时间:2023-05-04 05:05:39 阅读:26886 作者:1278

数据库事务的隔离级别从低到高有四种,分别为Read uncommitted 、Read committed 、Repeatable read 、Serializable。 以下通过实例阐述这些概念和联系。

1. 读未提交 (Read uncommitted)

在此隔离级别上,所有事务都可以看到其他未提交的事务的执行结果。 此隔离级别的性能优于其他级别,因此很少投入使用。 读取未提交的数据,也称为脏读。

事例:上司向程序员支付工资。 程序员的工资为3.6万/月。 但是,发薪日上司错误地按了数字,变成了3.9万/月。 那笔钱转到了程序员的账户上,但事务还没有交。 那时,程序员去查了自己这个月的工资,比平时多了三千元,觉得涨了工资,很高兴。 但是,上司很快就意识到了错误,马上将差点提交的事务回滚,将数字改为3.6万后提交。

分析:实际程序员这个月的工资还是3.6万,但程序员看到的是3.9万。 他看到的是上司还没有提交事务时的数据。 这是肮脏的读法。 因此,在此隔离级别上,查询不会被锁定。 此隔离级别的一致性最差,因为查询未锁定,可能会出现“脏读”、“不可重复读”和“幻像读”。 如果没有特殊情况,基本上不会使用这种隔离级别。

怎么解决不洁的读法? 领先优势! 可以提出来解决不洁的读书问题。

2. 读提交(Read Committed)

这是大多数数据库系统的默认隔离级别。 但是,它不是MySQL的默认值。 它满足了隔离的简单定义。 一个事务只能看到已经提交给办事处的更改。 该隔离级别支持所谓的不可重复读取。 同一事务的其他实例在实例处理期间可能会有新的commit,因此同一选择可能会返回不同的结果。

事例:程序员拿着信用卡去享受生活。 (卡里当然只有3.6万。 他埋单的时候)程序员事务接通时,资费系统事先检测出他卡里有3.6万。 就是这个时候。 程序员的妻子必须把钱全部拿出来供家庭用。 收费系统准备取现时,重新检查卡上的金额,发现钱不见了。 (第二次检查金额当然要等妻子转出金额事务提交完毕。 程序员会变得忧郁。 明明卡里有钱……

分析:这就是领先提交。 如果存在要更新(UPDATE )数据的事务,则在提交此更新操作事务之前,读事务无法读取数据。 可以解决脏领导的问题。 但是,在此实例中,一个事务范围内的两个相同查询返回不同的数据。 这是不能重复阅读的。

3.可重复读(Repeated Read)

这是MySQL的缺省事务隔离级别,使同一事务的多个实例在同时读取数据时显示相同的数据行。 但是,从理论上讲,这引起了另一个棘手的问题。 幻读(Phantom Read )。 简单来说,幻像读取意味着用户读取一个范围内的数据行时,另一个事务会在该范围内插入新行,而用户读取该范围内的数据行时,会有新的“幻影”行。 InnoDB和Falcon存储引擎通过MVCC、multiversionconcurrencycontrol机制解决了此问题。

4.可串行化 (Serializable)

这是数据库最高的隔离级别,在此级别,事务“序列化并按顺序执行”,然后一个接一个地排队执行。 在此级别,可以避免“脏读”、“不可重复读”和“幻像读”,但执行效率极低,性能开销最大,因此几乎没有人使用。 这应该可以理解。 以牺牲性能为代价确保安全。

这四种隔离级别以不同的锁定类型实现,读取相同的数据容易出现问题。 例如,脏读(Drity Read):如果一个事务更新数据,另一个事务当前读取相同的数据,并且由于某种原因操作了上一个回滚,则下一个事务读取的数据是不可重复读(Non-repeatable read):在一个事务的两次查询中数据不匹配。 这可能是在两次查询期间插入了事务更新的原始数据。幻读(Phantom Read):在一个事务的两次查询中数据数不匹配。 例如,假设一个事务查询几列(Row )中的数据,而另一个事务当前插入了新列中的数据。 在以前的事务中,以下查询会检测到以前不存在的列中的一些数据。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。