• 面试题精讲丨MySQL的隔离级别真的越高越好吗?!


    一. 前言

    最近有学生出去面试,被问到这样一个题目:

    假设目前你们使用的数据库是MySQL,现在有一个事务A,在事务A开始时读取数据的结果是1

    事务A中间有一段耗时操作,在事务A做耗时操作的同时,有另外一个事务B把数据值改成了2并提交了

    请问在事务A中再一次查询该数据的结果应该是1还是2,并且说明原因。

    如下图所示:

    二. 先观察结果

    在讲清楚这个问题之前,耀哥要先和大家一起打开数据库,看看这个问题的执行结果。

    我们可以首先创建一张表,这个表的名字叫做【tb_test】,并且插入一条数据,如下图所示:

    接下来耀哥再开启一个事务A,在事务A中,我们首先查询出id=1这一行中d列的结果。

    此时再开启第二个事务B,在事务B中把数据修改成2。

    此时数据库中,id=1这条数据中d列的值已经等于2了。我们再回到事务A中,观察一下此时查询的结果是多少。

    现在我们把事务A结束,再查询观察一下此时的结果。

    三. MySQL的默认隔离级别

    大家此时就可以知道这个问题的答案了!我们发现【MySQL在同一个事务中,多次查询的同一个值的结果是不会变的,即使这个值被其他的事务改变过】。接下来耀哥就和大家来分析一下这个问题的原理。

    3.1 事务并发带来的问题【脏读,不可重复读,幻读】

    • 脏读实际上就是在一个事务中读取到了另外一个事务还没有提交的数据;

      如下图所示:

    • 不可重复读在同一个事务中,读取同一数据的结果不一样

      如下图所示:

    • 幻读:指同一个事务在前后两次查询同一个范围的时候,后一次查询看到了前一次查询没有看到的数据行 。

      如下图所示:

    3.2 数据库事务的隔离级别

    • 数据库提供4种隔离级别,来解决上述由于事务并发带来的问题。

      如下表所示:

    3.3 MyQL数据库的默认级别

    现在市面上常见数据库的默认隔离级别并不一样,比如Oracle 和 SQL Server的默认隔离级别是【读已提交】,这能解决脏读的问题。而我们面试题中用的MySQL数据库,其默认隔离级别是【可重复读】。

    至此,面试题答案是 1 的原因,我们应该可以理解了!MySQL默认隔离级别是【可重复读】,所以在同一个事务中,读取同一个数据得到的结果应该是一样的。

    四. 小结

    事务隔离级别越高,在并发产生的问题就越少,但同时付出的性能消耗也越大,因此很多时候必须在并发性和性能之间做一个权衡现在你对数据库的隔离级别以及事务特性的理解是不是又加深了呢?如果你还有其他问题,可以在评论区给耀哥留言哦。

    *威哥Java学习交流Q群:691533824
    加群备注:CSDN推荐

  • 相关阅读:
    C# WPF Threads 和 Dispatchers 有什么区别
    阿里本地生活全域日志平台 Xlog 的思考与实践
    通信原理学习笔记【持续更新】
    【JAVAEE基础学习(14)】--简述redis
    如何获取小程序运行能力,知道Finclip就够了?
    几何光学的基本原理
    HTML+CSS+Jquery实现北大官网所有效果
    【总结】岛屿类问题(二维表格的dfs)
    Nginx三大常用功能“反向代理,负载均衡,动静分离”
    Java真的不难(四十八)Redis的入门及使用(1)
  • 原文地址:https://blog.csdn.net/finally_vince/article/details/126031241