并行事务会引发什么问题?_有点小白的菜鸟-编程思维

并行事务会引发什么问题?

MySQL 服务端是允许多个客户端连接的,这意味着 MySQL 会出现同时处理多个事务的情况。

那么在同时处理多个事务的时候,就可能出现脏读(dirty read)、不可重复读(non-repeatable read)、幻读(phantom read)的问题

接下来,通过举例子给大家说明,这些问题是如何发生的。

脏读

如果一个事务「读到」了另一个「未提交事务修改过的数据」,就意味着发生了「脏读」现象。

不可重复读

在一个事务内多次读取同一个数据,如果出现前后两次读到的数据不一样的情况,就意味着发生了「不可重复读」现象。

幻读

在一个事务内多次查询某个符合查询条件的「记录数量」,如果出现前后两次查询到的记录数量不一样的情况,就意味着发生了「幻读」现象。

事务A:

mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into user values(1522158666475192324,'testtt','test','1','test','test',0);
Query OK, 1 row affected (0.00 sec)

mysql> select * from user;
+---------------------+--------------+-------------+------+-----------+--------+--------+
| id                  | name         | phone       | sex  | id_number | avatar | status |
+---------------------+--------------+-------------+------+-----------+--------+--------+
| 1522158666475192321 | 我是谁??? | 13571761373 | NULL | NULL      | NULL   |      1 |
| 1522158666475192323 | test         | test        | 1    | test      | test   |      0 |
| 1522158666475192324 | testtt       | test        | 1    | test      | test   |      0 |
+---------------------+--------------+-------------+------+-----------+--------+--------+

mysql> commit;

事务B:

mysql> start transaction;
mysql> select * from user;
+---------------------+--------------+-------------+------+-----------+--------+--------+
| id                  | name         | phone       | sex  | id_number | avatar | status |
+---------------------+--------------+-------------+------+-----------+--------+--------+
| 1522158666475192321 | 我是谁??? | 13571761373 | NULL | NULL      | NULL   |      1 |
| 1522158666475192323 | test         | test        | 1    | test      | test   |      0 |
+---------------------+--------------+-------------+------+-----------+--------+--------+
2 rows in set (0.11 sec)

mysql> select * from user for update;
+---------------------+--------------+-------------+------+-----------+--------+--------+
| id                  | name         | phone       | sex  | id_number | avatar | status |
+---------------------+--------------+-------------+------+-----------+--------+--------+
| 1522158666475192321 | 我是谁??? | 13571761373 | NULL | NULL      | NULL   |      1 |
| 1522158666475192323 | test         | test        | 1    | test      | test   |      0 |
| 1522158666475192324 | testtt       | test        | 1    | test      | test   |      0 |
+---------------------+--------------+-------------+------+-----------+--------+--------+
3 rows in set (33.73 sec)

-- 或者
mysql> update user set name = 'up' where id = 1522158666475192324;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0
mysql> select * from user;
+---------------------+--------------+-------------+------+-----------+--------+--------+
| id                  | name         | phone       | sex  | id_number | avatar | status |
+---------------------+--------------+-------------+------+-----------+--------+--------+
| 1522158666475192321 | 我是谁??? | 13571761373 | NULL | NULL      | NULL   |      1 |
| 1522158666475192323 | test         | test        | 1    | test      | test   |      0 |
| 1522158666475192324 | up           | test        | 1    | test      | test   |      0 |
+---------------------+--------------+-------------+------+-----------+--------+--------+
3 rows in set (0.09 sec)

执行顺序:

B:select * from user; -- 结果两条记录
A:insert into user values();  -- 未提交
B:select * from user for update; -- 结果三条记录,查当前(for update)
-- 或
B:update user set name = 'up' where id = 1522158666475192324;
B:select * from user; -- 结果三条记录,因为上条更新语句会先查全表数据

-- 对于事务B来说出现了幻觉,这种现象即为幻读。在同一事务中,相同查询条件记录数不同。

版权声明:本文版权归作者所有,遵循 CC 4.0 BY-SA 许可协议, 转载请注明原文链接
https://www.cnblogs.com/malongfeistudy/p/16796937.html

查询效率提升10倍!3种优化方案,帮你解决mysql深分页问题_鲁班快跑-编程思维

开发经常遇到分页查询的需求,但是当翻页过多的时候,就会产生深分页,导致查询效率急剧下降。 有没有什么办法,能解决深分页的问题呢? 本文总结了三种优化方案,查询效率直接提升10倍,一起学习一下。 1. 准备数据 先创建一张用户表,只在create_time字段上加索引: CREATE TABLE `user` ( `

亲测-ubuntu20.04 安装 mysql5.7_immaxfang-编程思维

背景介绍 ubuntu 20.04 版本系统自带的 MySQL 版本是 8.0,普通方法很难安装 5.7 版本的。由于 8.0 版本较 5.7 版本做了不少改动,笔者比较习惯使用 5.7 版本。 网上搜做了一圈,跟着各种教程试了很多遍,最后终于找到了成功的方法。过程记录分享出来,供大家参考。 安装过程 笔者的环境: r

推荐有礼 | 京东云推荐返利活动说明 - 编程思维

京东云云推客是京东云推出的服务于代理商群体的交易服务平台。为代理商提供可代理产品、分销获客工具、渠道管理工具、对账结算工具等,赋能代理商数字化升级,实现降本增效。京东云推客交流群,如果你在参与活动中遇到问题,可以扫码加群交流:一、有效业绩说明:1. 京东云推客需通过个人或企业实名后才能进行推广;2. 云官网新用户通过推

【研发分享】stonedb如何给tianmu引擎增加delete功能(调研之旅) - 编程思维

StoneDB 作为开源项目,一直秉持开源开放的基本原则,我们的社区版代码现在已经完全在 Github 上开源,并不断提高代码的可读友好性,同时,为了让大家更好地理解我们是如何打造一款一体化 HTAP 开源数据库的,我们会定期把一些核心技术的研发实现思路分享给大家,也算是抛砖引玉,如果读者有更好的实现思路,也欢迎与我们

innodb-表空间 - 编程思维

前言大家好,我是xicheng。现在继续更新MySQL,本篇讲InnoDB的表空间,该部分类容比较枯燥繁琐,但又是MySQL后续内容的基础。所以大家可以先学习理解整体框架,等后续篇章用到的时候,再回过头查阅,进一步加深理解。另外,InnoDB的知识脑图如下所示,大家坐稳了。表空间表空间(tablespace)由段(sa

技术分享 | mysql--测试--排序规则 collation - 编程思维

作者:姚嵩外星人...本文来源:原创投稿*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。摘抄:https://dev.mysql.com/doc/ref...https://dev.mysql.com/doc/ref...https://dev.mysql.com/doc/ref...ht

查询效率提升10倍!3种优化方案,帮你解决mysql深分页问题_鲁班快跑-编程思维

开发经常遇到分页查询的需求,但是当翻页过多的时候,就会产生深分页,导致查询效率急剧下降。 有没有什么办法,能解决深分页的问题呢? 本文总结了三种优化方案,查询效率直接提升10倍,一起学习一下。 1. 准备数据 先创建一张用户表,只在create_time字段上加索引: CREATE TABLE `user` ( `

亲测-ubuntu20.04 安装 mysql5.7_immaxfang-编程思维

背景介绍 ubuntu 20.04 版本系统自带的 MySQL 版本是 8.0,普通方法很难安装 5.7 版本的。由于 8.0 版本较 5.7 版本做了不少改动,笔者比较习惯使用 5.7 版本。 网上搜做了一圈,跟着各种教程试了很多遍,最后终于找到了成功的方法。过程记录分享出来,供大家参考。 安装过程 笔者的环境: r

优化 sql 的 21 条方案_技术颜良-编程思维

一、查询 SQL 尽量不要使用 select *,而是具体字段 1、反例 SELECT * FROM user 2、正例 SELECT id,username,tel FROM user 3、理由 节省资源、减少网络开销。 可能用到覆盖索引,减少回表,提高查询效率。 注意:为节省时间,下面的样例字段都用*代

mysql索引(究极无敌细节版)_cuzzz-编程思维

参考了: https://www.jianshu.com/p/ace3cd6526c4 推荐up主https://space.bilibili.com/377905911 推荐书籍《mysql是怎样运行的》 推荐极客时间《MySQL实战45讲》——林晓斌 系列文章目录和关于我 一丶什么是索引 索引是存储引擎快速找到记

mysql数据库规范_程序猿的代码-编程思维

MySQL数据库规范 前言 今天我们来聊一聊MySQL数据库常见的一些建议设计规范,参考阿里的《JAVA开发手册泰山版》,我们简单挑出几处进行简单分析和回顾复习,如果有不正确或者不足的地方,还请指正。 规范 表名、字段名命名必须使用小写字母或数字,并且使用下划线进行分隔,禁止以数字开头。 MySQL在Wind