前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Mysql 脏读、不可重复读、幻读

Mysql 脏读、不可重复读、幻读

原创
作者头像
BLACK595
发布2024-09-30 16:31:17
1540
发布2024-09-30 16:31:17

在Mysql中常用的InndDB是支持并发事务的,也就是能够在同一时间允许多个事务对数据库进行操作,那么问题来了,如果一个事务在写数据,另一个事务要读数据会发生什么;如果一个事务在写数据,另一个事务也要写又会发生什么。具体来说,这就有可能产生脏读、不可重复读和幻读。

代码语言:txt
复制
事务是逻辑上的一组操作,要么全部执行,要么全部不执行

脏读

一个事务读取到了另一个未提交事务修改的数据。这可能导致读取到的数据是无效或错误的,因为那个未提交的事务可能最终会回滚或修改。

例如,事务 A 修改了一条数据但未提交,此时事务 B 读取了这条被修改的数据。如果事务 A 回滚,那么事务 B 读取到的数据就是脏数据。

事务B读取了事务A修改后的数据,但事务A后面回滚,数据回到了修改前,此时事务B手里的数据还是之前的数据,也就是脏数据。

不可重复读

一个事务在执行过程中多次读取同一数据,但是每次读取的结果不一致。这是因为在这个事务执行期间,有其他事务修改了该数据并提交。

比如,事务 A 读取某条数据,事务 B 随后修改并提交了该数据,当事务 A 再次读取时得到了不同的结果。两次读取的结果不一致,因此称为不可重复读。

幻读

一个事务在执行过程中,按照相同的条件进行查询,两次得到的结果集行数不同。这通常是因为在事务执行期间,有其他事务插入或删除了满足条件的数据。

例如,事务 A 按照某个条件查询得到结果集,事务 B 插入了一些符合该条件的数据并提交,当事务 A 再次按照相同条件查询时,结果集的行数增多了,就好像出现了“幻影”的数据。

这里我们有个学生表,初始时有8条数据:

  1. 事务A在插入前先去看了下不存在主键为9的数据,符合正常逻辑。
  2. 事务B直接插入了一条主键为9的数据并提交了事务。
  3. 事务A再去插入发现插入失败,主键冲突,明明刚刚还检查了没有主键为9的,现在却冲突了,就好像出现了“幻影”。事务隔离级别为了解决上面问题,Mysql为我们提供了4种事务隔离级别来解决。隔离级别逐渐上升,性能逐渐下降。
  4. Read Uncommitted(读未提交):它是性能最好的,事务中的修改,即使没有提交,其他事务也可以看得到,会导致“脏读”、“幻读”和“不可重复读取”。
  5. READ COMMITTED(读已提交):允许读取并发事务已经提交的数据,不允许读取另一个并行事务已修改但未提交的数据,避免了“脏读”,但不能避免“幻读”和“不可重复读取”。
  6. REPEATABLE READ(重复读):保证了一个事务不会修改已经由另一个事务读取但未提交(回滚)的数据。Mysql的默认隔离级别,避免了“脏读取”和“不可重复读取”的情况,但不能避免“幻读”。
  7. Serializable (串行化):一个事务处理的时候,其他事务都等着。读的时候加共享锁,也就是其他事务可以并发读,但是不能写。写的时候加排它锁,其他事务不能并发写也不能并发读。这样“脏读”、“不可重复读”、“幻读”都能避免了,但此隔离级别性能最低。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 脏读
  • 不可重复读
  • 幻读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档