你不能不知道的脏写,脏读,不可重复读,幻读超级详细解读

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用版 2核4GB 50GB
简介: 你不能不知道的脏写,脏读,不可重复读,幻读超级详细解读

关于这四个数据并发问题mysql其实都有解决的方法,这边分为两篇文章去解读,这篇文章主要讲解这四个的概念与代码的实现,下一篇主要讲的是mysql的隔离级别,欢迎大家关注。


什么是脏写?

image.png

图片部分部分引用了宋红康老师的课件图片

这个图片的意思就是A会话开启了一个事物,然后B会话也开启了一个事物,B进行了更新名称的操作,A也更新了名称,A提交了事务,b回滚事物,这个结果就是名称啥都没变,这就是脏写


image.png

由于mysql的事物隔离级别都解决了脏写的问题,所以我们就没有不能够进行演示了


什么是脏读


image.png


AB开始了事物,这个时候B进行更新,但是B没有提交,A过来select的时候读到了name为张三,其实B没有提交A是读到的应该还是原来的老数据,所以这就是脏读,下面我们用代码演示一下

由于mysql的默认事物隔离级别是可重复读

我们可以看一下:

show variables like 'transaction_isolation';


3a2996e5d2124a1da0c9ca33b2df4c79.png

对比上面的图片,我们知道要把隔离级别切换为读未提交

set TRANSACTION_ISOLATION = 'READ-UNCOMMITTED';


a5cad5ab8e0f424eb4a3130668305597.png

65c14b02ab844f15a823ea4a8e87d486.png



首先我们创建一条数据表

CREATE TABLE account (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(15),
balance DECIMAL(10,2)
);


image.png


插入两条数据


image.png


我们俩边都开启事物,模拟张三给李四转100元的事件。


eac749af8f744953b9761a872f56bfb6.png


这个时候我们给张三减一百元


image.png


注意我们这里还没有提交事物!!


7fe1a7bacba74a128c05dc138d2580f7.png


可以看到我们在另一个会话中看到了张三的钱已经变成0了,这种情况就叫脏读,就是读到了另一个事物没有提交的数据。之后若是A回滚,b读到的数据就是无效的


b261459eab474ff28338c7f39f6f5c13.png

什么是不可重复读


这个的意思就是A开启事物,首先读一条数据:

15391ee40c8146f485beaff5ec9ebd47.png


然后B更新一条数据:


e5b569b995e149dc8f451fe18733cfc5.png

然后A去查询数据:

a9255d0f8b294efb8f5ca50b697e40b5.png


就会发现数据变了,这就是不可重复读。这个就违背隔离性的概念了 事务之前不能相互影响 所有我这个事务里查的数据不能被你影响。

什么是幻读?


95d4a9c6d3c14440ac39dc21be510b7b.png

我们这里也是A开启事物:


540614c60a6d459bb76bef0abde2a89d.png


读数据:

440ee913b4bb45e3a83ed6b534a59112.png

然后B插入一条数据:


fd0e430a3abe42f88d82d32d59d3b3e2.png

这个时候A再去读,发现多了一行数据,这就是幻读。


e2974f3dc0ec4b0490506abb79a26f6c.png

那么有同学问了,不可重复读和幻读有什么区别,注意:一个是更新,一个是插入。

这些东西都是可以在mysql上面避免的,只要我们设置了他们的隔离级别


282dbcd5b0124487a149fdb15db7d24c.png

那么下一章我们讲解数据的四种隔离级别,欢迎大家关注一波。

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
12月前
|
存储 关系型数据库 MySQL
幻读的探讨
幻读是数据库中常见的一种问题,它指的是在一个事务中,由于并发操作而导致同一个查询多次读取的结果不一致的现象。在这篇博客文中,我将详细探讨幻读的概念、原因和解决办法。
65 0
|
2月前
|
SQL 关系型数据库 MySQL
对数据库事务理解以及脏读、不可重复读以及幻读问题
对数据库事务理解以及脏读、不可重复读以及幻读问题
|
2月前
|
SQL 数据库
|
2月前
|
SQL
事务的隔离级别
事务的隔离级别 多个事务之间隔离的,相互独立的。但是如果多个事务操作同一批数据,则会引发一些问题。设置不同隔离级别就可以解决 1.脏读:一个事务,读取到另一个事务中没有提交的数据 2.不可重复读,在同一个事务中,两次读取的数据不一样 3.幻读:(dml)一个事务操作数据表中记录,另一个事务添加了一条数据,则第一个事务查询不到自己的修改 隔离级别 1.read uncommitted:读未提交 产生问题:脏读、不可重复读、幻读 2.read committed:读已提交 产生问题:不可重复读、幻读 3.repeatable read:可重复读 产生问题:幻读 4.serializable:串行
27 0
|
2月前
|
存储 SQL 关系型数据库
不可重复读
不可重复读
|
12月前
|
数据库
脏读、幻读、不可重复读
脏读是指在数据库事务中,一个事务读取了另一个事务未提交的数据。当一个事务进行数据修改但还未提交时,另一个事务读取了这个未提交的数据。如果发生了回滚操作,读取到的数据将是无效的。脏读可能会导致数据的不一致性和错误的结果。
47 0
|
12月前
|
数据库
数据库事务的并发问题 (脏读、幻读、不可重复读)
数据库事务的并发问题 (脏读、幻读、不可重复读)
95 0
|
12月前
|
算法 关系型数据库 MySQL
事务的隔离级别和对应的问题
事务的隔离级别和对应的问题
图解脏读、幻读、不可重复读
图解脏读、幻读、不可重复读
59 0
|
关系型数据库 MySQL
解决并发事务造成的脏读,幻读,不可重复读问题
解决并发事务造成的脏读,幻读,不可重复读问题
114 0