MySQL - 并发事务问题及解决方案
文章目录
- 生猛干货
- Pre
- 脏读
- 不可重复读
- 幻读
- Solutions
- 搞定MySQL
生猛干货
带你搞定MySQL实战,轻松对应海量业务处理及高并发需求,从容应对大场面试
Pre
MySQL - 多版本控制 MVCC 机制初探
中我们初步了解了 MVCC 的原理及其实现。 随着数据库并发事务处理能力的增强,数据库资源的利用率也会大大提高,从而提高了数据库系统的事务吞吐量,可以支持更多的用户并发访问。
但并发事务处理也会带来一些问题,如:脏读、不可重复读、幻读等等
脏读
一个事务正在对一条记录做修改,在这个事务完成并提交前,这条记录的数据就处于不一致状态;这时,另一个事务也来读取同一条记录,如果不加控制,第二个事务读取了这些“脏”数据,并据此做进一步的处理,就会产生未提交的数据依赖关系。这种现象被形象的叫作"脏读"(Dirty Reads)。
简答来说,读取了其他事务未提交的数据
不可重复读
一个事务在读取某些数据后的某个时间,再次读取以前读过的数据,却发现其读出的数据已经发生了改变、或某些记录已经被删除了!这种现象就叫作“ 不可重复读”(Non-Repeatable Reads)。
幻读
一个事务按相同的查询条件重新读取以前检索过的数据,却发现其他事务插入了满足其查询条件的新数据,这种现象就称为“幻读”(Phantom Reads)。
Solutions
MySQL 数据库是通过事务隔离级别来解决上述问题的。
我们举例说明“脏读”和“不可重复读”的问题
【 RC 隔离级别】
MySQL 中默认的事务隔离级别是 RR,这里设置成 RC 隔离级别,此时提交事务 B 修改 id=1 的数据之后,事务 A 进行同样的查询操作,后一次和前一次的查询结果不一样,这就是不可重复读(重新读取产生的结果不一样了)。这里事务 A 读到了事务 B 提交的数据,即是“脏读”。
【RR隔离级别】
下面我们来看看在mysql默认的RR隔离级别下的情况。当 teacher_id=1时,事务 A 先进行一次读取操作,事务 B 中间修改了 id=1 的数据并提交,事务 C 也插入了一条数据并提交。事务 A 第二次读到的数据和第一次完全相同。所以说它是可重读的。
【幻读】
行锁可以防止不同事务版本的数据在修改提交时造成数据冲突的情况。但如何避免别的事务插入数据造成的问题呢。我们先来看看在 RC 隔离级别下的处理过程。
如下图所示,事务 A 修改了所有 teacher_id=30 的数据,但是当事务 B INSERT 新数据后,事务 A 发现莫名其妙的多了一行 teacher_id=30 的数据, 而且没有被之前的 UPDATE语句所修改,这就是“当前读”的幻读问题。
跟上面的例子一样,也是在 RC 事务隔离级别下,这时事务 B INSERT 了一条数据,并提交,而事务 A 读到了事务 B 新插入的数据。这也是幻读,如下图所示。
这里就需要重点注意不可重复读和幻读的区别了。前面讲了它们的含义,这个提醒大家的是:不可重复读重点在于 UPDATA 和 DELETE,而幻读的重点在于 INSERT。它们之间最大的区别是如何通过锁机制来解决它们产生的问题。这里说的锁只是使用悲观锁机制。
那么在 RR 隔离级别下,事务 A 在 UPDATE 后加锁,事务 B 无法插入新数据,这样事务 A在 UPDATE 前后读的数据保持一致,避免了幻读。
跟上面的案例一样,也是在 RR 事务隔离级别下,事务 A 在 UPDATE 后加锁,对于其他两个事务,事务 B 和事务 C 的 INSERT 操作,就必须等事务 A 提交后,才能继续执行。这里就用到了“锁”,这里使用的是 Gap 锁,后面会详细讲解。它和上面的情况一样,解决了“幻读”的发生,如下图所示。
搞定MySQL
MySQL - 并发事务问题及解决方案相关推荐
- 高并发事务问题以及解决方案
事务的概念 事务 可以理解为一个 独立的工作单元, 在这个独立的工作单元中, 有一组操作; 放在事务(独立工作单元)中的多个操作, 要么全部执行成功, 要么全部执行失败. 不免俗套, 这还是通过最经典 ...
- 为什么Actor模型是高并发事务的终极解决方案?
首先看看道友提出的一个问题: 用户甲的操作 1.开始事务 2.访问表A 3.访问表B 4.提交事务 乙用户在操作 1.开始事务 2.访问表B 3.访问表A 4.提交事务 如果甲用户和乙用户的两个事务同 ...
- mysql长事务慢查询解决方案_MySQL : 如何监控和处理慢查询与长事务 ?
什么是慢查询.长事务 ? 慢查询 是指一条 SQL 的执行时间太长.比如在一个有100w条数据的表中,查询一条数据时未命中索引,从而通过全表扫描查询数据,这个查询会耗时很长.这就是一个 Long SQ ...
- mysql并发更新数据,多用户并发修改数据解决方案。
mysql并发更新数据,多用户并发修改数据解决方案. 在系统中,有一些如余额.资产.积分的数据,是要保证数据一致性的.如,一个人使用两个设备同时进行消费操作,如何保证数据一致性的问题. 我们一起来思考 ...
- MySQL高并发事务问题
事务的概念 事务 可以理解为一个 独立的工作单元, 在这个独立的工作单元中, 有一组操作; 放在事务(独立工作单元)中的多个操作, 要么全部执行成功, 要么全部执行失败. 不免俗套, 这还是通过最经典 ...
- mysql 并发_Mysql事务,并发问题,锁机制
1.什么是事务 事务是一条或多条数据库操作语句的组合,具备ACID,4个特点. 原子性:要不全部成功,要不全部撤销 隔离性:事务之间相互独立,互不干扰 一致性:数据库正确地改变状态后,数据库的一致性约 ...
- mysql 并发性_MySQL 事务
1.什么是事务,为什么需要事务 事务(Transaction)是数据库并发控制的不可分割的基本单位,可以将一系列的数据库操作集合到一个事务中,从总体上来讲这个事务可能会对数据库进行一些变动.事务存在的 ...
- Mysql并发读写解决方案分析--MVCC
数据库并发场景 所有系统的并发场景都是三种,对于数据库而言为: 读-读:不存在任何问题,也不需要并发控制. 读-写:有线程安全问题,可能会造成事务隔离性问题,也就是脏读,不可重复读,幻读. 写-写:有 ...
- mysql sql 事务写作_mysql中的事务
MySQL事务相关 一. 什么是事务 事务(Transaction)是一个逻辑序列,该序列要么执行,要么不执行. 例如:转换业务 A 给 B 转账 1000 元,设计两个操作: A减少1000元 B增 ...
最新文章
- TransG : A Generative Model for Knowledge Graph Embedding ACL 2016.Berlin, Germany.
- Oracle 12c coming soon?
- python不能处理excel文件-python处理excel文件(xls和xlsx)
- leetcode 寻找重复的数633 python
- mysql整段注释_MySQL 添加注释(comment)
- vue 导出Excel
- 寻找互联网创业的时间点规律
- Linq的内部执行原理浅析
- 计算机网络工程师试题及答案,计算机软考网络工程师自测试题及答案汇总
- 脉冲电磁阀工作原理图(给到爱学习的你)(转)
- c语言中空格的转义字符是什么意思,转义字符-转义字符是什么意思? 爱问知识人...
- java咖啡是研磨的吗_研磨咖啡,这三个点一定要注意
- allure报告定制
- Centos7安装MySql8出现失败处理
- KEGG_cnetplot绘制基因—通路图(展示想要的通路)——R
- ubuntu桌面版下配置锐捷客户端
- 电脑WIN XP蓝屏错误代码大全
- 16g电脑内存有什么好处_开车播放车载音乐 选择车载U盘有什么好处?
- 如何选择合适的前端框架,告别选择恐惧症
- Java项目:停车位租赁系统(java+SSM+JSP+Maven+mysql)
热门文章
- Json、Gson、FAST-JSON解析学习
- oracle是堆屎山,Oracle NUMBER 类型细讲
- python zip
- tableau可视化数据分析60讲(四)-tableau数据源操作数据提取
- Flink从入门到精通100篇(十五)-Flink SQL FileSystem Connector 分区提交与自定义小文件合并策略 ​
- 产品运营必须知道的几个概念,什么是跳出率和退出率?
- Excel:5种判断奇数和偶数的方法
- php 根据权重随机数,PHP根据概率产生随机数
- 利用百度的词法分析区分数据
- win10下,cmd可以运行java,却不能运行javac