MySQL的四个事务隔离级别有哪些?各自存在哪些问题?

前言

大家应该都知道mysql的事务有四个隔离级别,但是他们分别是什么隔离级别并且会带来什么问题呢?接下来我为大家一一揭晓,通过图解的方式方便大家理解。

一、读未提交(Read Uncommitted)

1、这个是隔离级别最低的。

2、顾名思义,可以看出来就是一个事务可以读取另外一个未提交事务的修改。

3、存在的问题也最多,包含脏读、不可重复读、幻读。

4、因为存在问题最多,也是使用最少的隔离级别。

从图上可以看出来,事务1第一次查询的结果为18,当事务2修改过后事务在未提交的情况下,事务1再次查询的结果变为20

这个就是脏读,事务1读取到了事务2修改了但是还未提交的数据。

二、读已提交(Read Committed)

1、大多数的数据库的默认隔离级别,但是mysql的默认隔离级别不是这个。

2、顾名思义,可以看出来一个事务只能读取到已经提交事务的修改。

3、存在的问题,包含不可重复读、幻读。

4、因为它只能读取到已经提交事务的修改,所以解决了脏读的情况。

从图上可以看出来,事务1第一次读取的结果为18,当事务2修改完数据但是未提交事务的情况

MySQL事务隔离级别用于控制事务之间的可见性和并发行为,以解决并发操作中可能出现的问题(如脏读、不可重复读、幻读等)。MySQL 支持四种标准的事务隔离级别。 --- ## ✅ MySQL事务隔离级别 | 隔离级别 | 描述 | 脏读 | 不可重复读 | 幻读 | 丢失更新 | 加锁读 | |----------|------|------|------------|------|----------|--------| | `READ UNCOMMITTED` | 最低的隔离级别,允许读取尚未提交的数据变更 | ✅ 允许 | ✅ 允许 | ✅ 允许 | ✅ 允许 | ❌ 不加锁 | | `READ COMMITTED` | 一个事务只能读取已经提交的数据 | ❌ 禁止 | ✅ 允许 | ✅ 允许 | ❌ 禁止 | ❌ 不加锁(Oracle默认) | | `REPEATABLE READ` | 可重复读,确保同一事务中多次读取的结果一致 | ❌ 禁止 | ❌ 禁止 | ❌ 禁止(InnoDB通过间隙锁解决) | ❌ 禁止 | ✅ 加锁(InnoDB) | | `SERIALIZABLE` | 所有操作串行化执行,避免并发问题 | ❌ 禁止 | ❌ 禁止 | ❌ 禁止 | ❌ 禁止 | ✅ 强制加锁 | > ⚠️ **MySQL InnoDB 引擎在 REPEATABLE READ 隔离级别下已经解决了幻读问题**,这是通过间隙锁(Gap Lock)和临键锁(Next-Key Lock)实现的。 --- ## 🔒 隔离级别与锁机制的关系 - **脏读(Dirty Read)**:一个事务读取了另一个未提交事务的数据。 - **不可重复读(Non-repeatable Read)**:一个事务内多次读取同一数据,结果不一致,因为其他事务修改并提交了该数据。 - **幻读(Phantom Read)**:一个事务内多次查询某个范围的数据,结果集数量变化,因为其他事务插入或删除了匹配的数据。 - **丢失更新(Lost Update)**:两个事务同时更新同一数据,其中一个事务的更新被覆盖。 --- ## 🛠 查看和设置隔离级别 ### 查看当前会话的隔离级别: ```sql SELECT @@tx_isolation; -- 或者 SELECT @@SESSION.tx_isolation; ``` ### 查看全局的隔离级别: ```sql SELECT @@GLOBAL.tx_isolation; ``` ### 设置隔离级别(会话级): ```sql SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; ``` ### 设置隔离级别(全局级): ```sql SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ; ``` --- ## 💡 实际应用建议 - **默认使用 `REPEATABLE READ`(InnoDB 默认)**:适合大多数业务场景,平衡性能与一致性。 - **需要高并发写入时,选择 `READ COMMITTED`**:适用于 Oracle 用户习惯。 - **对一致性要求极高时,使用 `SERIALIZABLE`**:牺牲性能换取绝对一致性。 - **开发调试阶段可以使用 `READ UNCOMMITTED`**:快速查看未提交数据,但风险很高。 --- ###
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ayzen1988

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值