前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【MySQL】MySQL事务的问题:脏读、幻读、不可重复读

【MySQL】MySQL事务的问题:脏读、幻读、不可重复读

作者头像
硬核项目经理
发布于 2024-04-12 06:15:38
发布于 2024-04-12 06:15:38
27700
代码可运行
举报
运行总次数:0
代码可运行

MySQL事务的问题:脏读、幻读、不可重复读

在上一篇文章中,我们已经学习过了事务相关的基础知识,今天,我们继续学习事务有可能带来的一些问题。其实在一次请求和连接中,事务是不会出现什么问题的,毕竟在一个事务中,要么全提交,要么全回滚。但是如果有多个客户端连接,也就是说在并发操作事务的情况下,就会发生各种问题。其中最典型的就是下面三种情况,不过首先我们设置一下事务隔离级别,这个东西我们下次再讲,这回我们先把事务隔离级别设置为最低的级别。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- my.cnf
[server]
transaction-isolation = READ-UNCOMMITTED

脏读

脏读的意思就是两个事务同时在运行,其中 A 事务修改了某个字段,B 事务读取了这个字段,这时可能因为某种原因,A 事务的修改操作回滚了,那么 B 读取的数据就是不正确的,也就是说,B 读到的数据是 “脏” 的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- 事务 A
mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> update test_user set username = 'aaa' where id = 2199993;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

-- 事务 B
mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> select username from test_user where id = 2199993;
+----------+
| username |
+----------+
| aaa      |
+----------+
1 row in set (0.00 sec)

在这个例子中,事务 A 没有提交,但事务 B 读取到的依然是修改之后的数据,之后如果事务 A 回滚或者再次修改成别的数据,那么 B 那边之前读取到的数据就一直是有问题的。

更加典型的例子是,假如我们修改的是你帐户里余额,本身余额有 100 块,第一笔交易将余额修改成了 80 块,这时第二个交易事务过来,读到了你的余额是 80 块,然后又扣了 10 块钱,正常情况下你的余额应该是 70 块了。但是,注意,第一笔交易的事务出现问题了,无法正常继续交易,于是回滚成 100 块。然而第二笔交易的事务并不知情,依然正常交易并提交了,这时你的余额就变成了 70 元。很明显,这就产生了问题,这个就是脏读带来的结果,一致性出现了问题。

不可重复读

不可重复读是啥意思呢?其实跟上面的是一样概念,只是说我们的 B 事务之后又读了一次 A 事务已经提交的数据,发现两次数据不对呀,这就是不可重复读。官方一点的解释就是:A 事务修改了数据,B 事务在修改前和修改后读取的数据不一样。注意,在不可重复读中,没有回滚的操作,另外,如果两个事务同时都是修改一条数据的话,那么后修改的数据会覆盖前面修改事务的操作结果,这也是不可重复读的问题。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- 事务B
mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> select username from test_user where id = 2199993;
+----------------------+
| username             |
+----------------------+
| 355607b664269a13dae9 |
+----------------------+
1 row in set (0.00 sec)

-- 事务A
mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> update test_user set username = 'aaa' where id = 2199993;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> commit;
Query OK, 1 row affected (0.00 sec)

-- 事务B
mysql> select username from test_user where id = 2199993;
+----------+
| username |
+----------+
| aaa      |
+----------+
1 row in set (0.00 sec)

幻读

最后一个幻读,其实它和前面两个问题的情况也是类似的,都是读取的不一致问题,并且和不可重复读非常类似。当 B 事务读取数据时使用的是聚合方式,比如说查询数量,那么假设 A 事务在 B 事务第一次读取后增加或者删除了数据,那么 B 事务第二次读取的时候这个数量就会发生变化,就好像产生幻觉了一样。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- 事务B第一次读取
mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> select count(*) from test_user;
+----------+
| count(*) |
+----------+
|  2200001 |
+----------+
1 row in set (0.49 sec)

-- 事务A删除
mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> delete from test_user where id < 10;
Query OK, 9 rows affected (0.00 sec)

-- 事务B再次读取
mysql> select count(*) from test_user;
+----------+
| count(*) |
+----------+
|  2199992 |
+----------+
1 row in set (0.37 sec)

咋一看,幻读和不可重复读貌似是一个意思呀?确实,它们非常类似,但是,幻读更强调的是聚合操作结果,而不是单一一条数据的修改,这就是它们两个之间最本质的区别。

总结

好了,问题呈现在眼前了,其实大家应该能看出,事务常见的这三个问题都和数据的一致性读取有关,也就是说,在多个并发事务的前提下,如何保证数据的并发一致性就是我们要面对的问题。那么这些问题是怎么解决的呢?这个就是我们下回要讲到的内容了,也就是 事务隔离 机制相关的知识。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-04-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码农老张 微信公众号,前往查看

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

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【MySQL】MySQL解决事务问题:事务隔离机制
在了解完事务可能出现的问题之后,我们就来学习数据库系统中为了解决这些问题所提供的策略,那就是 事务隔离机制 。其实从名字中就可以看出来,这个功能的主要作用就是隔离不同的事务,从而达到最终的事务一致性。
硬核项目经理
2024/04/12
2760
【MySQL】MySQL解决事务问题:事务隔离机制
【MySQL入门】之细说脏读、幻读及不可重复读
ACID原则是数据库事务正常执行的四个基本要素,分别指原子性、一致性、隔离性及持久性。
MySQL数据库技术栈
2020/08/05
9080
【MySQL入门】之细说脏读、幻读及不可重复读
MySQL事务的讲解
对MySQL数据库中的事务操作、存在的问题和相应的隔离级别等知识点进行整理,通过实例进行说明
泽霖
2023/11/26
2310
玩转Mysql系列 - 第13篇:详解事务
数据库中的事务是指对数据库执行一批操作,这些操作最终要么全部执行成功,要么全部失败,不会存在部分成功的情况。
路人甲Java
2019/09/30
8170
MySQL基础9-事务
  事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有操作作为一个整体一起向系统提交或者撤销操作请求,即这些操作要么同时成功,要么同时失败。mysql的事务默认是自动提交的,也就是说,当执行一条DML语句,Mysql会立即隐式的提交事务
Se7eN_HOU
2023/09/01
1690
MySQL基础9-事务
【MySQL】MySQL事务特性与自动提交
又是比较偏基础理论的一篇文章,不过这也是向 MySQL 更高水平进阶的必经之路。关于事务以及事务隔离机制,其实是所有关系型数据库都有的问题,它是一套比较基础的理论和工具。
硬核项目经理
2024/04/12
4240
【MySQL】MySQL事务特性与自动提交
MySQL-性能优化_大表和大事务的常用处理方案
http://www.searchdoc.cn/rdbms/mysql/dev.mysql.com/doc/refman/5.7/en/index.com.coder114.cn.html
小小工匠
2021/08/17
1.3K0
数据库事务隔离级别
在并发的场景中,为了保证数据的一致性我们会在数据库中使用事务。然而在强一致性与性能上则需要根据具体业务来取舍,所以一般数据库提供了四种事务隔离级别: 读未提交(Read Uncommitted) 读提交(Read Committed) 可重复读(Repeatable Read) 序列化(Serializable) 由于日常工作中使用事务比较频繁,遂在此作一下总结 在了解这四种事务隔离级别之前,需要了解如下概念: 更新丢失(Lost Update): 两个事务同时修改一行数据,其中一个事务的更新被另外一个事
码农二狗
2018/06/29
5620
MySQL 之事务
什么是事务? 事务是程序中一系列严密的操作,所有操作执行必须成功完成,否则在每个操作所做的更改将会被撤销,这也是事务的原子性(要么成功,要么失败)。
小手冰凉
2020/05/16
5140
mysql事务和锁的实践
脏读 : 就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据
OwenZhang
2021/12/08
4450
Mysql脏读、幻读、不可重复读(二)
脏读指的是一个事务读取到了另一个事务未提交的数据。当一个事务修改数据但还没有提交时,另一个事务读取到了这个未提交的数据,并做出了相应的操作。如果第一个事务回滚,那么第二个事务读取到的数据就是无效的。
疯狂的KK
2023/07/23
3300
Mysql脏读、幻读、不可重复读(二)
MySQL|事务特性与隔离级别详解
在介绍MySQL事务的概念之前,先通过一个简单但比较经典的案例,看看为什么数据库会有事务、需要事务。
堆栈哲学
2023/03/08
6790
MySQL|事务特性与隔离级别详解
一线互联网公司是怎么处理mysql事务以及隔离级别的?
MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!
美的让人心动
2018/10/12
1.1K1
MySQL数据库,详解事务处理(二)
我们可以将⼀⼤批操作分为⼏个部分,然后指定回滚某个部分。可以使⽤savepoin来实
用户1289394
2021/11/16
6750
MySQL的事务隔离级别 | 2023腾讯·技术创作特训营 第三期
不知道你有没有讲过这种场景,比如转账。正常情况下是一定要确保转出账户转出的金额,是正确累加到转入账户,任何一方的异常,都可判定这个交易是异常,这样的系统也是不可靠的。
Lemon黄
2023/11/18
3410
脏读,不可重复读,幻读
在介绍脏读,不可重复读,幻读现象之前,我们先来了解MySQL的事务隔离级别,因为脏读,不可重复读,幻读等现象都是由数据库里的事务隔离级别来决定是否可能发生的。
端碗吹水
2020/09/23
1.8K0
脏读,不可重复读,幻读
MySQL数据库,详解事务处理(三)
# 隔离级别设置,READ-UNCOMMITTED读未提交,READ-COMMITTED读已提交,REPEATABLEREAD可重复读,SERIALIZABLE串⾏
用户1289394
2021/11/16
4980
Innodb事务的一些概念
事务是由一系列SQL组成的逻辑处理单元,要么全'部'执行,要么全'不'执行。事务具有四个属性,也就是常说的ACID属性,分别代表原子性,一致性,隔离性和持久性,再重新巩固一下吧:
AsiaYe
2019/11/06
3430
Innodb事务的一些概念
MySQL 事务和 MVCC 机制
了解事务之前,先来看看数据库为什么需要有事务,假设没有事务会有什么影响?假设我们有一个银行账户系统,表结构如下:
Se7en258
2021/07/01
5170
Mysql 脏读、不可重复读、幻读
在Mysql中常用的InndDB是支持并发事务的,也就是能够在同一时间允许多个事务对数据库进行操作,那么问题来了,如果一个事务在写数据,另一个事务要读数据会发生什么;如果一个事务在写数据,另一个事务也要写又会发生什么。具体来说,这就有可能产生脏读、不可重复读和幻读。
一杯茶Ja
2024/09/30
2680
相关推荐
【MySQL】MySQL解决事务问题:事务隔离机制
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验