首页 > 数据库 >带你搞懂MySQL隔离级别,两个事务同时操作同一行数据会怎样?

带你搞懂MySQL隔离级别,两个事务同时操作同一行数据会怎样?

时间:2022-12-23 15:08:13浏览次数:34  
标签:事务 隔离 数据库 查询 MySQL 搞懂 级别


一. 前言

最近有学生出去面试,被问到这样一个题目:【假设目前你们使用的数据库是MySQL,现在有一个事务A,在事务A开始时读取到的数据结果是1事务A中间有一段耗时操作,在事务A做耗时操作的同时,有另外一个事务B把数据值改成了2并提交了请问在事务A中再一次查询该数据的结果应该是1还是2,并且说明原因】如下图所示:

带你搞懂MySQL隔离级别,两个事务同时操作同一行数据会怎样?_数据

二. 执行结果

在讲清楚这个问题之前,壹哥要先和大家一起打开数据库,看看这个问题的执行结果。我们可以首先创建一张表,这个表的名字叫做【tb_test】,并且插入一条数据,如下图所示:

带你搞懂MySQL隔离级别,两个事务同时操作同一行数据会怎样?_mysql_02

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

带你搞懂MySQL隔离级别,两个事务同时操作同一行数据会怎样?_mysql_03

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

带你搞懂MySQL隔离级别,两个事务同时操作同一行数据会怎样?_数据库_04

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

带你搞懂MySQL隔离级别,两个事务同时操作同一行数据会怎样?_数据库_05

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

带你搞懂MySQL隔离级别,两个事务同时操作同一行数据会怎样?_隔离级别_06

三. MySQL的默认隔离级别

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

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

脏读实际上就是在一个事务中读取到了另外一个事务还没有提交的数据如下图所示:

带你搞懂MySQL隔离级别,两个事务同时操作同一行数据会怎样?_数据库_07

不可重复读在同一个事务中,读取同一数据的结果不一样。如下图所示:

带你搞懂MySQL隔离级别,两个事务同时操作同一行数据会怎样?_mysql_08

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

带你搞懂MySQL隔离级别,两个事务同时操作同一行数据会怎样?_数据库_09

3.2 数据库事务的隔离级别

数据库提供了4种隔离级别,来解决上述由于事务并发带来的问题,如下表所示:

带你搞懂MySQL隔离级别,两个事务同时操作同一行数据会怎样?_隔离级别_10

3.3 MyQL数据库的默认级别

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

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

带你搞懂MySQL隔离级别,两个事务同时操作同一行数据会怎样?_java_11

四. 小结

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

标签:事务,隔离,数据库,查询,MySQL,搞懂,级别
From: https://blog.51cto.com/u_7044146/5965711

相关文章

  • 带你手写starter组件,搞懂SpringBoot自动配置原理
    一.问题阐述最近有不少同学问壹哥,使用SpringBoot和使用XML配置到底有什么区别。其实如果我们只从编写代码的逻辑来看,使用SpringBoot同样是按照三层架构,从控制层、逻辑层再......
  • Windows系统下MySQL8.0版详细安装及配置教程
    一.前言MySQL是目前最为流行的开源数据库产品,是完全网络化跨平台的关系型数据库系统。它起初是由瑞典MySQLAB公司开发,后来被Oracle公司收购,目前属于Oracle公司。因为开源,所......
  • Day01_06_Linux_Ubuntu教程之安装配置MySQL
    Linux安装MySQL服务器及客户端本教程以ubuntu18.04系统为例1.安装mysql1.1更新ubuntu的source数据源apt-getupdate1.2安装mysql-serverapt-getinstallmysql-server......
  • MySQL中的级联删除与更新策略on delete restrict on update restrict
    MySQL中的级联删除与更新策略ondeleterestrictonupdaterestrict在MySQL中,当我们执行级联删除与级联更新时,可能会执行OnDeleteRestrict和OnUpdateRestrict语句,这两......
  • MySQL Data source rejected establishment of connection, message from server: “T
    MySQL数据库中Datasourcerejectedestablishmentofconnection "Toomanyconnections"异常解决错误原因: 利用C3P0数据源,连接MySQL服务器时,产生了太多的连接数,数据库客......
  • 11:高级部分-MySQL
    (目录)(一)view视图1.开场高级部分不属于实习内容,已经超过了实习范围尤其是培训机构不会讲这些,主要是经验规范之谈2.view视图创建、使用以及作用视图主要负责筛选,有......
  • centos7安装mysql5.7
    centos7安装mysql5.7环境搭建、清理旧安装包进入到目录/usr/local/中cd/usr/local/创建目录/usr/local/tools,如果有则忽略mkdir-ptools创建/usr/local/mysq......
  • MySQL-索引优化
    回顾聚簇索引,官网的定义在这里。聚簇索引无法显示创建,存储引擎会根据一定的规则自动创建,具体规则优先级是:主键--》非空唯一索引--》隐藏列rowid**InnoDB表的主键列应该......
  • docker中mysql配置主从
    创建文件夹&编辑my.cnf内容mkdir-p/opt/docker/mysql-8.0/master/cnfmkdir-p/opt/docker/mysql-8.0/master/datavim/opt/docker/mysql-8.0/master/cnf/mysql.cnf[......
  • 一文搞懂HTTPS的握手方法
    HTTPS握手方法加密加密的大致种类:不可逆加密。比如MD5、SHA、HMAC小明将文件加密得到一串密码a,并把文件和密码a给小红,小红拿到文件之后使用同样的算法得到密码b,......