首页 > 数据库 >MySQL面试题

MySQL面试题

时间:2024-04-08 10:58:27浏览次数:11  
标签:面试题 读取 幻读 数据 事务 查询 MySQL 级别

一、MySQL的事务隔离级别

SQL中定义了4种隔离级别,不同的隔离级别对应着事务中做不同的修改,同时在事务内和事务间的可见性也不同。越低的隔离级别越能支持更高的并发,对系统的开销也越低。

1. read uncommitted (未提交读)

最低级别,允许一个事务读取另一个事务尚未提交的数据。这可能导致脏读、不可重复读和幻读的问题。
在read uncommitted 级别中,当在事务A中对数据的修改即使是在事务未提交的时候,其他并发操作的事务依然可以读取到事务A修改的数据,这种情况我们叫做数据“脏读”。那如果事务A在后面出现回滚的操作时,而其他事务在已经读取到的是事务A之前的修改,就会导致出现数据的修改混乱。

2. read committed (已提交读)

允许一个事务只读取其他已提交事务的数据。这可以避免脏读,但仍可能出现不可重复读和幻读的问题。
在read committed级别中,当一个事务A从开始直到事务提交之前,其他的并发事务对该事务的修改都是不可见的。但是在其他同一事务内执行两次一样的查询时,查询的结果也会不同,所以这个级别同时也叫做不可重复读。

其他大多数的数据库默认的隔离级别都是read committed ,但是mysql 默认隔离级别不是。

3. repeatable read (可重复读)

mysql 默认隔离级别。在一个事务中,多次读取同一数据会得到相同的结果,即使其他事务对该数据进行了修改。这可以避免脏读和不可重复读,但可能出现幻读问题。

“幻读”是指当某个事务在读取某个范围内的记录时另一个事务又在该范围内插入了新的数据,那么再次读取该范围的数据时会出现幻行。

MySQL在存储引擎(InnoDB和XtraDB)下是通过锁机制加MVCC(多版本并发控制)来解决幻读的问题。

因此也是MySQL 中默认使用的事务隔离级别,同时需要使用事务时一般使用InnoDB存储引擎。

4. serializable (可串行化)

最高级别,要求事务串行执行,即事务之间没有并发。可以避免脏读、不可重复读和幻读,但会影响并发性能。
serializable隔离级别是将各个事务强制串行执行,在每个事务执行时都会对该事务影响的数据行进行加锁,因此其他并发的事务则无法进行读写操作,需等这条事务提交后并释放锁才能进行下一个事务的执行。

由于需要对每条数据都加锁,这样就会导致大量的操作超时和锁争用的问题。

在我们的实际项目开发中很少使用这个级别。

————————————————

脏读(Dirty Read):
定义:脏读是指一个事务读取到了另一个事务尚未提交的数据,当那个事务最终回滚时,读取的数据就变得无效或“脏”了。

示例:假设有两个银行账户,Alice 和 Bob。Alice 想要转账给 Bob 1000美元,但在她的事务还没有提交之前,Bob 的查询可能会显示他的余额增加了1000美元。然而,如果 Alice 的事务最终回滚,Bob 实际上并没有得到这1000美元。

不可重复读(Non-Repeatable Read):
定义:不可重复读是指在同一个事务中,多次读取相同数据时,得到了不同的结果。这是因为在事务执行期间,其他事务修改了数据。

示例:假设小明正在查询某本书的价格,结果是50美元。然后,他再次查询,但在这之间,另一个用户购买了这本书并将价格提高到100美元。因此,小明两次查询相同的数据得到了不同的结果,这就是不可重复读。

幻读(Phantom Read):
定义:幻读是指在同一个事务中,多次执行相同的查询,但由于其他事务插入新数据或删除现有数据,每次查询返回的结果集不一样。

示例:考虑一个图书馆数据库,小红正在查询某个作者的所有书籍。第一次查询返回了5本书,但在事务执行期间,另一个用户添加了一本新书,所以在第二次查询时,返回了6本书。这就是幻读,因为查询结果集似乎发生了变化,尽管小红的事务并没有修改任何数据。

 

标签:面试题,读取,幻读,数据,事务,查询,MySQL,级别
From: https://www.cnblogs.com/Neonuu/p/18120633

相关文章

  • MySQL 常见和不常见的所有查询语句
    介绍:MySQL是一个功能强大的关系型数据库管理系统,支持丰富的查询语句,用于从数据库中检索、插入、更新和删除数据。本文将介绍MySQL中常见和不常见的所有查询语句,并为每个语句提供示例。常见查询语句:1.select 从数据中检索数据select*fromtable_name;2.insert  向......
  • C语言面试题目
    1.不能做switch()的参数类型是:switch的参数不能为实型。2.static有什么用途?(请至少说明两种)1)限制变量的作用域 2)设置变量的存储域static修饰局部变量时,会改变局部变量的存储位置,从而使得局部变量的生命周期变长。static修饰全局变量时,会......
  • mysql数据库备份命令大全
    1.mysqldump命令#备份整个数据库mysqldump-uusername-pdbname>backup.sql#备份选择的表mysqldump-uusername-pdbnametable1table2>backup.sql#压缩备份文件mysqldump-uusername-pdbname|gzip>backup.sql.gz#恢复备份mysql-uusername-pdbname<backup.......
  • Springboot计算机毕业设计橙心优购微信小程序的设计与实现【附源码】开题+论文+mysql+
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着移动互联网的快速发展和普及,微信小程序作为一种新兴的移动应用形态,受到了广大用户的青睐。微信小程序不仅具备即用即走、无需安装的特点,而且能够......
  • Springboot计算机毕业设计宠物领养与物品捐赠小程序【附源码】开题+论文+mysql+程序+
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着人们生活质量的提升,越来越多的人选择宠物作为生活中的伴侣。然而,宠物数量的增长也带来了一系列问题,如流浪宠物数量的增加、宠物养护知识的缺乏等......
  • Mysql8.0高可用部署
    Mysql8.0高可用部署前言目前是三台服务器,每台服务器部署mysql、mgr、proxysql、keepalived,mysql8.0是通过mgr的方式来实现mysql服务的高可用,实现故障自动检测及自动切换,发生故障时能自动切换到新的主节点,但是当程序调用的mysql对应的服务宕机后,无法自动切换到正常服务上面......
  • koa下mysql连接池案例
    下面是一个简单的示例,演示了如何在Koa应用程序中使用MySQL连接池:constKoa=require('koa');constRouter=require('koa-router');constmysql=require('mysql');constapp=newKoa();constrouter=newRouter();//创建MySQL连接池constpool=mysql.cre......
  • sql注入-MySQL
    01.常用符号、函数、语句1.1.常用符号1.1.1.注释符注释符说明#(%23)单行注释在URL中#表示锚点,也就是hash路由,带上#不会请求后端路由,而是刷新前端路由,所以测试一般用URL编码后的%23––-±-+单行注释注意–后还有一个空格;其中+号会被URL解码为......
  • mysql系列之一条sql的旅程(二)
    在介绍一条sql是怎么执行的之前,我们先来了解一下mysql的架构: 如上图mysql主要分为server层和存储引擎层:server层算是mysql的核心能力层,如sql语句的解析优化,权限管控,各类的sql函数、存储过程,以及自身数据备份,恢复等高级功能(binlog实现),我们用到的一些基础的增删......
  • 使用MySQL驱动方式实现读写分离
    前言MySQL在5.1.X版本之后增加了对multi-host的支持,我们可以使用它来实现读写分离。正常的jdbc连接格式为jdbc:mysql://ip:3306/testdb?characterEncoding=UTF-8multi-host的jdbc连接格式为jdbc:mysql:replication://ip:3306,ip:3307,ip:3308/testdb?useUnicode=t......