首页 > 其他分享 >并行事务会引发什么问题?

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

时间:2022-10-16 20:00:52浏览次数:68  
标签:事务 并行 引发 +---------------------+--------------+-------------+------+-----------+

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

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来说出现了幻觉,这种现象即为幻读。在同一事务中,相同查询条件记录数不同。

标签:事务,并行,引发,+---------------------+--------------+-------------+------+-----------+
From: https://www.cnblogs.com/malongfeistudy/p/16796937.html

相关文章

  • 多线程并行与分布式执行
    假如项目中有测试用例1000条,一条测试用例需要执行1分钟,一个测试人员需要1000分钟才能完成一个轮回测试。通常会用人力成本换取时间成本,加几个人的一起执行,时间就会缩短。如......
  • 一个拼写错误引发的问题:Failed to pull image "nignx": rpc error: code = Unknown de
    问题在引入阿里镜像加速器后,手动命令行部署nginx,发现pod的status为ImagePullBackOff排查思路1.使用kubectldescribepodweb-64d985c689-49d4b检查pod的一些信息,发现......
  • Spring Batch 事务限制
    对SpringBatch有所了解的同学都知道Batch是用来进行批量数据处理的。但是我们在同时使用SpringJPA的时候,尤其是循环数据处理的时候,我们希望能够尽快提交事务。......
  • Spring 数据处理中的事务级别
    在Spring项目中,如果使用了Spring的事务管理的话。默认的事务级别都在类,这个级别的,这就导致了,如果在循环中对数据进行处理的话,如果循环不结束,事务是不会提交的。如果......
  • Jedis(五大数据类型,事务)
    简介Jedis是Redis官方推荐的Java连接开发工具。要在Java开发中使用好Redis中间件,必须对Jedis熟悉才能写成漂亮的代码测试联通打开window下的redis-server,1、新建一个普......
  • InnoDB存储引擎:事务
    认识事务概述事务:访问并更新数据库中各种数据项的一个程序执行单元。数据库引入事务的主要目的:事务会把数据库从一种一致状态转换为另一种一致状态。在数据库提交工作时......
  • 数据库第十三次作业 事务管理【带源码】
    目录​​一、新建数据库​​​​二、事务的提交​​​​ 1.事务的隔离级别​​​​1.1脏读 ​​​​1.2演示脏读 ​​​​1.3设置b账户中事务的隔离级别 ​​​​1.4.验......
  • THINKPHP5 事务操作
    THINKPHP5事务操作使用事务处理的话,需要数据库引擎支持事务处理。比如MySQL的MyISAM不支持事务处理,需要使用 InnoDB 引擎。自动控制事务处理Db::transaction(functio......
  • MySQL事务隔离
    MySQL事务隔离该文摘抄自林晓斌老师的文章提到事务,你肯定不陌生,和数据库打交道的时候,我们总是会用到事务。最经典的例子就是转账,你要给朋友小王转100块钱,而此时你的银......
  • C#事务的使用
    https://blog.csdn.net/VisageNocturne/article/details/112094795http://t.zoukankan.com/SmilePastaLi-p-6824387.htmlhttps://www.w3xue.com/exp/article/20225/79298......