MySQL 的四种事务隔离级别

本文深入解析MySQL数据库的事务概念及其ACID特性,详细介绍了四种事务隔离级别:未提交读、提交读、可重复读和串行读,并探讨了在并发环境中可能遇到的丢失修改、脏读、不可重复读和幻读等一致性问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MySQL数据库提供了四种事务隔离级别:

  • READ_UNCOMMITTED - 未提交读
  • READ_COMMITTED - 提交读
  • REPEATABLE_READ - 可重复读
  • SERIALIZABLE - 串行读

什么是事务

事务指的是满足 ACID 特性的一组操作,可以通过 Commit 提交一个事务,也可以使用 Rollback 进行回滚。

事务的ACID四大特性

原子性(Atomicity)

事务是不可分割最小单元,事务内所有操作要么全部成功提交,要么全部失败回滚。

回滚可以用回滚日志来实现,回滚日志记录着事务所执行的修改操作,在回滚时反向执行这些修改操作即可。

隔离性

一个事务所做的修改在提交以前,对其它事务是不可见的。

一致性

数据库在事务执行前后都保持一致性状态。
在一致性状态下,所有事务对一个数据的读取结果都是相同的。

持久性

事务一旦提交,其所做的修改将会永久保存到数据库中。即使系统发生崩溃,事务执行的结果也不能丢失。

使用重做日志来保证持久性

只有满足一致性,事务的执行结果才是正确的。
在无并发的情况下,事务串行执行,隔离性一定能够满足。此时只要能满足原子性,就一定能满足一致性。
在并发的情况下,多个事务并行执行,事务不仅要满足原子性,还需要满足隔离性,才能满足一致性。
事务满足持久性是为了能应对数据库崩溃的情况。

并发一致性问题

在并发环境下,事务的隔离性很难保证,因此会出现很多并发一致性问题

丢失修改

两个事务 A 和 B 都对一个数据进行修改,A 先修改,B 后修改,B 的修改覆盖了A 的需改

脏读

事务 A 修改了一个数据未提交,事务 B 读取了这个数据,如果事务 A 回滚这次修改,那么事务 B 读到的就是脏数据。

不可重复读

事务 A 读取一个数据,事务 B 修改了这个数据。如果事务 A 再次读取这个数据会导致两次读取结果不一致。

幻读

事务 A 读取某个范围的数据,事务 B 在这个范围内插入一条数据。如果事务 A 再次读取这个范围的数据会导致两次读取结果不一致。

事务隔离级别

未提交读

一个事务所做的修改即使没有提交,对其他事务也是可见的。

提交读

一个事务所做的修改在提交之前对其他事务是不可见的。

可重复读

保证一个事务内多次读取同样数据的结果是一致的。

可串行读

强制事务串行执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值