MySQL 的事务隔离级别(重点面试题)

MySQL 的事务隔离级别(重点面试题⭐️⭐️⭐️)

SQL 标准定义了四种隔离级别,MySQL 全都支持. 这四种隔离级别分别是:

1.读未提交(READ UNCOMMITTED):

读未提交,也叫未提交读. 该隔离级别的事务可以看到其他事务中未提交的数据.

举个例子:

事务1 ,是用来提交数据 的,事务2 ,是用来查询数据的。

事务1,插入了一条新的数据,但是事务1还没有提交(commit)。

此时,事务2,查询数据库中的数据。但是事务2查询到的数据,却包含了事务1未提交的数据。

存在的问题:脏读

因为其他事务未提交的数据 可能会发生回滚,但是该隔离级别却可以读到 ,我们把该级别读到的数据称之为脏数据,这个问题称之为脏读.

2.读已提交(READ COMMITTED):

读已提交 ,也叫提交读。

该隔离级别的事务能读取到已经提交事务的数据,该隔离级别不会有脏读的问题.

举个例子:

存在的问题:不可重复读

但由于在事务的执行中可以读取到其他事务提交的结果,所以在不同时间的相同 SQL 查询 可能会得到不同的结果 ,这种现象叫做不可重复读

3.可重复读(REPEATABLE READ):

事务不会读到其他事务对已有数据的修改 ,即使其他事务已提交。

即:在同一个事务 当中,同一个 sql语句 ,得到的结果是一样的。

为什么是这样的?和 MVCC机制有关。

MVCC机制,建议百度,ai,搜索:

MVCC机制,如何实现 在同一个事务当中,同一个 sql语句,得到的结果是一样的?

MVCC 保证同一事务中同条 SQL 结果一致,核心就两点:

  1. 事务第一次查数据时 ,会生成一个「数据快照 + 可见性规则」(Read View) ,后续不管查多少次,都复用这个快照和规则,不看新数据;
  2. 即便其他事务修改数据并且完成提交,当前事务看到的仍然是快照记录的旧版本数据。

因此,在当前事务内部,同一条查询 SQL,多次执行得到的查询结果始终保持一致。

也就可以确保同一事务多次查询的结果一致,但是其他事务新插入的数据,是可以感知到的. 这也就引发了幻读问题.

可重复读,是 MySQL 的默认事务隔离级别。

存在的问题:幻读

比如:此级别的事务正在执行时,另一个事务成功的插入了某条数据,但因为它每次查询的结果都是一样的,所以会导致查询不到这条数据。

自己重复插入同一条数据时又失败(因为唯一约束的原因)。

明明在事务中查询不到这条信息,但自己就是插入不进去,这个现象叫幻读.

画图来理解:

问题分析:

事务2,查询两次 数据库表,没有查询到 新的数据

但是,当 事务2 插入 事务1 最新插入的记录

insert语句,就会执行失败。

原因:事务2的隔离级别 是 不可重复读 无法查看到事务1插入后的数据 ,不知道这条记录,已经存在,所以事务2插入相同的记录,插入失败

这个问题:就叫做 幻读

4.串行化(SERIALIZABLE):

序列化,事务最高隔离级别。

存在的问题:事务的执行效率低

它会强制事务排序,使之不会发生冲突,从而解决了脏读,不可重复读和幻读问题,但因为执行效率低,所以真正使用的场景并不多。

一张图总结:

脏读 :读未提交存在的问题

表现:事务2 读到 事务1 没有提交的数据。

不可重复读 :读已提交存在的问题

表现:事务1执行插入数据的操作,事务2,两次读到的数据不一致 。

第一次 是事务1还没提交 ,事务2 读到了没有提交数据的记录

第二次 是事务1 提交了数据 。事务2 读到了提交了数据的记录

幻读 :可重复读存在的问题

表现:事务2读取不到事务1修改后的数据(插入数据),事务2自己进行相同操作(插入数据)时,会失败。

结尾

最后,如果这篇博客能帮到你的,请你点点赞,有写错了,写的不好的,欢迎评论指出,谢谢!

相关推荐
yeflx9 分钟前
Ubuntu22.04安装Mysql Workbench
数据库·mysql·adb
PaperData11 分钟前
1986-2025年《中国能源统计年鉴》全年份pdf+excel版
数据库·能源
夜雪一千15 分钟前
MySQL 自增 ID 的底层原理与坑点
android·mysql·adb
SelectDB技术团队23 分钟前
日志场景 Elasticsearch 替换实操:建表、索引、写入链路与查询改写的完整参数
大数据·数据库·数据仓库·elasticsearch·全文检索·日志分析·apache doris
百数平台29 分钟前
低代码安全技术实践:表单 / 流程 / 报表三级权限体系设计解析
java·大数据·数据库
驭渊的小故事33 分钟前
MyBatis-Plus 实战指南:从基础 CRUD 到条件构造器与自定义 SQL(二)
数据库·sql·mybatis
小小AK36 分钟前
销售订单从 CRM 推到 ERP:一条策略的完整同步实战
数据库
木雷坞38 分钟前
Docker Compose部署Docmost:数据库、附件持久化与首次协作
数据库·docker·容器
VidDown41 分钟前
上线三个月后的第一次事故:一个 Django 服务的日志、监控与故障复盘
数据库·python·django·wpf·音视频·视频编解码
小蒜学长1 小时前
基于Springboot+Vue的高校教师教学业绩综合管理系统的设计与开发(代码+数据库+LW)
java·数据库·spring boot·后端·教学业绩管理·三级权限