MySQL 事务的默认隔离级别是什么?可以解决幻读问题么?

何谓事务

我们设想一个场景,这个场景中我们需要插入多条相关联的数据数据库,不幸的是,这个过程可能会遇到下面这些问题:

  • 数据库中途突然因为某些原因挂掉了。
  • 客户端突然因为网络原因连接不上数据库了。
  • 并发访问数据库时,多个线程同时写入数据库,覆盖了彼此的更改。
  • ……

上面的任何一个问题都可能会导致数据的不一致性。为了保证数据的一致性,系统必须能够处理这些问题。事务就是我们抽象出来简化这些问题的首选机制。事务的概念起源于数据库,目前,已经成为一个比较广泛的概念。

何为事务? 一言蔽之,事务是逻辑上的一组操作,要么都执行,要么都不执行。

事务最经典也经常被拿出来说例子就是转账了。假如小明要给小红转账 1000 元,这个转账会涉及到两个关键操作,这两个操作必须都成功或者都失败。

  • 将小明的余额减少 1000 元
  • 将小红的余额增加 1000 元。
  • 事务会把这两个操作就可以看成逻辑上的一个整体,这个整体包含的操作要么都成功,要么都要失败。这样就不会出现小明余额减少而小红的余额却并没有增加的情况。

    何谓数据库事务?

    大多数情况下,我们在谈论事务的时候,如果没有特指分布式事务,往往指的就是数据库事务。

    数据库事务在我们日常开发中接触的最多了。如果你的项目属于单体架构的话,你接触到的往往就是数据库事务了。

    那数据库事务有什么作用呢?

    简单来说,数据库事务可以保证多个对数据库的操作(也就是 SQL 语句)构成一个逻辑上的整体。构成这个逻辑上的整体的这些数据库操作遵循:要么全部执行成功,要么全部不执行 。

    # 开启一个事务START TRANSACTION;# 多条 SQL 语句SQL1,SQL2…## 提交事务COMMIT;

    另外,关系型数据库(例如:MySQL、SQL Server、Oracle 等)事务都有 ACID 特性:

    ACID

  • 原子性(Atomicity) :事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用;
  • 一致性(Consistency):执行事务前后,数据保持一致,例如转账业务中,无论事务是否成功,转账者和收款人的总额应该是不变的;
  • 隔离性(Isolation):并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的;
  • 持久性(Durabilily):一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。
  • 这里要额外补充一点:只有保证了事务的持久性、原子性、隔离性之后,一致性才能得到保障。也就是说 A、I、D 是手段,C 是目的!

    并发事务带来了哪些问题?

    在典型的应用程序中,多个事务并发运行,经常会操作相同的数据来完成各自的任务(多个用户对同一数据进行操作)。并发虽然是必须的,但可能会导致以下的问题。

    • 脏读(Dirty read): 当一个事务正在访问数据并且对数据进行了修改,而这种修改还没有提交到数据库中,这时另外一个事务也访问了这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是“脏数据”,依据“脏数据”所做的操作可能是不正确的。
    • 丢失修改(Lost to modify): 指在一个事务读取一个数据时,另外一个事务也访问了该数据,那么在第一个事务中修改了这个数据后,第二个事务也修改了这个数据。这样第一个事务内的修改结果就被丢失,因此称为丢失修改。例如:事务 1 读取某表中的数据 A=20,事务 2 也读取 A=20,事务 1 修改 A=A-1,事务 2 也修改 A=A-1,最终结果 A=19,事务 1 的修改被丢失。
    • 不可重复读(Unrepeatable read): 指在一个事务内多次读同一数据。在这个事务还没有结束时,另一个事务也访问该数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改导致第一个事务两次读取的数据可能不太一样。这就发生了在一个事务内两次读到的数据是不一样的情况,因此称为不可重复读。
    • 幻读(Phantom read): 幻读与不可重复读类似。它发生在一个事务(T1)读取了几行数据,接着另一个并发事务(T2)插入了一些数据时。在随后的查询中,第一个事务(T1)就会发现多了一些原本不存在的记录,就好像发生了幻觉一样,所以称为幻读。

    不可重复读和幻读区别 :不可重复读的重点是修改比如多次读取一条记录发现其中某些列的值被修改,幻读的重点在于新增或者删除比如多次查询同一条查询语句(DQL)时,记录发现记录增多或减少了。

    SQL 标准定义了哪些事务隔离级别?

    SQL 标准定义了四个隔离级别:

    • READ-UNCOMMITTED(读取未提交) :最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。
    • READ-COMMITTED(读取已提交) :允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。
    • REPEATABLE-READ(可重复读) :对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。
    • SERIALIZABLE(可串行化) :最高的隔离级别,完全服从 ACID 的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。

    隔离级别脏读不可重复读幻读READ-UNCOMMITTED READ-COMMITTED REPEATABLE-READ SERIALIZABLE

    MySQL 的隔离级别是基于锁实现的吗?

    MySQL 的隔离级别基于锁和 MVCC 机制共同实现的。

    SERIALIZABLE 隔离级别,是通过锁来实现的。除了 SERIALIZABLE 隔离级别,其他的隔离级别都是基于 MVCC 实现。

    不过, SERIALIZABLE 之外的其他隔离级别可能也需要用到锁机制,就比如 REPEATABLE-READ 在当前读情况下需要使用加锁读来保证不会出现幻读。

    MySQL 的默认隔离级别是什么?

    MySQL InnoDB 存储引擎的默认支持的隔离级别是 REPEATABLE-READ(可重读)。我们可以通过SELECT @@tx_isolation;命令来查看,MySQL 8.0 该命令改为SELECT @@transaction_isolation;

    mysql> SELECT @@tx_isolation;+—————–+| @@tx_isolation |+—————–+| REPEATABLE-READ |+—————–+

    从上面对 SQL 标准定义了四个隔离级别的介绍可以看出,标准的 SQL 隔离级别定义里,REPEATABLE-READ(可重复读)是不可以防止幻读的。

    但是!InnoDB 实现的 REPEATABLE-READ 隔离级别其实是可以解决幻读问题发生的,主要有下面两种情况:

    • 快照读 :由 MVCC 机制来保证不出现幻读。
    • 当前读 :使用 Next-Key Lock 进行加锁来保证不出现幻读,Next-Key Lock 是行锁(Record Lock)和间隙锁(Gap Lock)的结合,行锁只能锁住已经存在的行,为了避免插入新行,需要依赖间隙锁。

    因为隔离级别越低,事务请求的锁越少,所以大部分数据库系统的隔离级别都是 READ-COMMITTED ,但是你要知道的是 InnoDB 存储引擎默认使用 REPEATABLE-READ 并不会有任何性能损失。

    InnoDB 存储引擎在分布式事务的情况下一般会用到 SERIALIZABLE 隔离级别。

    郑重声明:本文内容及图片均整理自互联网,不代表本站立场,版权归原作者所有,如有侵权请联系管理员(admin#wlmqw.com)删除。
    (0)
    用户投稿
    上一篇 2022年6月15日
    下一篇 2022年6月15日

    相关推荐

    • 哈利波特手游:纳威回响崛起!虎牙西客豪言养蛋流重出江湖

      各位哈利波特手游玩家应该都有经历过纳威养蛋流的版本吧?不过随着时间的更替,纳威回响逐渐跟不上版本,因为他的搭配方式实在是太单一了,导致现在很少有玩家去尝试这个流派。同时火灰蛇也是如…

      2022年6月29日
    • OPPO Reno7 5G 开放 ColorOS 12 × Android 12 正式版升级

      IT之家 6 月 14 日消息,今日,OPPO 官方宣布,OPPO Reno7 5G 开放 ColorOS 12 Android 12 正式版升级(正式版版本号为 C.05 及以上…

      2022年6月16日
    • 记者观察:让银行的归银行,电商的归电商

      21世纪经济报道记者 边万莉 实习生韩文榕 北京报道近年来,银行系电商发展势头减弱。与此同时,市场上出现了一些唱衰的声音。我们不妨重新思考,关停电商平台真的意味着银行放弃了电商业务…

      2022年6月25日
    • 女孩天生“平胸”是一种怎样的体验?漫画解析,看完谁破防了

      俗话说,爱美之心人皆有之,女性朋友对于美丽的追求从未停止,无论是过去还是现在大多数女性都是非常爱美的。 只是随着时代的变化,人们对于美丽的追求也有了很大的变化,可能在过去的时候,很…

      2022年9月18日
    • 都市传说,蓝可儿和电梯游戏是否有关联

      还记得,2003年发生在洛杉矶塞西尔酒店,震惊全球的蓝可儿事件吗?当年整起案件最引人注目的无疑是蓝可儿在失踪前与酒店电梯内做出了一系列诡异举动,在电梯监控画面曝光后,曾有网友声称这…

      2022年7月30日
    • 粉丝5400入手卡贴iPhone13Pro Max,虽价格低,但缺点多

      最近很多人买卡贴iPhone,因为卡贴iPhone价格太给力!iPhone13Pro Max也只要5000出头。卡贴机其实就是有锁机(网络锁),卡贴只是破解网络锁的。相比黑解,卡贴…

      2022年8月3日
    • 百亿数据分库分表核心流程详解

      前言 俗话说:面试造火箭,入职拧螺丝。尽管99.99%的业务都不需要用到分库分表,但是分库分表还是频繁出现在大厂的面试中。 分库分表涉及到的内容非常多,有很多细节,如果在面试中被问…

      2022年6月18日
    • 国内“致癌”洗面奶曝光 这些洗面奶上榜 这几个小众洗面奶反而出圈

      国内“致癌”洗面奶曝光吖!这些大牌洗面奶上榜啦 这几个小众洗面奶反而出圈 上了黑名单的洗面奶可不能再用了 有的烂脸,有的爆痘 有的起干皮 快看看这些小众洗面奶吧 用完脸蛋清爽干净还…

      2022年6月11日
    • 余额怎么转到银行卡不收手续费(余额提现到银行卡收费吗)

      余额宝资金转出到银行卡,是否收费,主要看你的转入余额宝的资金,是否是由银行卡转入的。如果是银行卡资金转入到余额宝,然后再转出到银行卡。那么就不会收取手续费。但是如果你的余额宝资金并…

      2022年10月29日
    • 移除 if-else

      前言 物流行业中,通常会涉及到EDI报文(XML格式文件)传输和回执接收,每发送一份EDI报文,后续都会收到与之关联的回执(标识该数据在第三方系统中的流转状态)。 这里枚举几种回执…

      2022年6月21日

    联系我们

    联系邮箱:admin#wlmqw.com
    工作时间:周一至周五,10:30-18:30,节假日休息