我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MySQL45讲之幻读 - flowers

短信预约 信息系统项目管理师 报名、考试、查分时间动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MySQL45讲之幻读 - flowers

MySQL45讲之幻读 - flowers

本文介绍什么是幻读,幻读存在的问题和解决方式,以及间隙锁带来的困扰。

前言

本文介绍什么是幻读,幻读存在的问题和解决方式,以及间隙锁带来的困扰。

什么是幻读

什么是幻读,有两个条件:

  1. 必须是“当前读”情况下才可能发生,“快照读”不会出现
  2. 只有插入操作才算幻读,更新和删除不算

幻读的问题

幻读会造成哪些问题?主要有两点:

  1. 在同一个事务内执行的两次或多次“当前读”操作,结果不一致
  2. 数据和日志记录不一致

模拟幻读

执行上述事务操作后,binlog 记录如下:

insert into t values(1,1,5); 
update t set c=5 where id=1; 

update t set d=100 where d=5;

update t set d=5 where id=0; 
update t set c=5 where id=0; 

执行的结果 id=1 这行是 (1,5,5),而 binlog 日志记录的是 (1,5,100),可见数据和日志是不一致的。

如何解决幻读

MySQL 在行锁(Record Lock)的基础之上,又引入了间隙锁(Gap Lock)。间隙锁就是对两条记录之间的间隙上锁,避免幻读在已经上锁情况下插入记录。注意,间隙锁之间不是互斥的。

行锁和间隙锁的结合称之为 next-key 锁,是一个前开后闭的区间,比如 (-∞,0]、(0,5]、(5,10]、(10,+suprenum]。其中,suprenum 是 InnoDB 为每个索引添加的不存在的最大值。

间隙锁的困扰

间隙锁解决了幻读的问题,但也带来了事务并发度降低和死锁的问题。比如下面的业务逻辑:

begin;
select * from t where id=N for update;


insert into t values(N,N,N);

update t set d=N set id=N;

commit;

为什么会产生死锁呢?看下面的事务流程:

间隙锁造成死锁

session A 和 session B 都对 (5,10) 间隙上锁,之后判断记录不存在,A 和 B 都进行记录插入操作,然后因为对方对 (5,10) 间隙上锁,导致锁等待,进入死锁状态。MySQL 检测到死锁后,重启 session A 事务,让 session B 先执行成功。

那有没有简单的方法避免这个死锁问题呢?
可以考虑将事务隔离级别设置为“提交读”,避免间隙锁同时提高事务的并发度。但是为了解决数据和日志的不一致问题,还需要将 binlog 格式设置为 row 模式。

参考

  • [1] 幻读是什么,幻读有什么问题

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MySQL45讲之幻读 - flowers

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

MySQL45讲之幻读 - flowers

本文介绍什么是幻读,幻读存在的问题和解决方式,以及间隙锁带来的困扰。 前言本文介绍什么是幻读,幻读存在的问题和解决方式,以及间隙锁带来的困扰。什么是幻读什么是幻读,有两个条件:必须是“当前读”情况下才可能发生,“快照读”不会出现只有插入操作才算幻读,更新
MySQL45讲之幻读 - flowers
2018-06-06

MySQL45讲之count操作 - flowers

本文介绍 MyISAM 和 InnoDB 如何执行 count 操作,如果是一个需要使用 count 进行大量计数的场景,应该如何设计实现,以及不同 count 操作的效率。 前言本文介绍 MyISAM 和 InnoDB 如何执行 count 操作,如果
MySQL45讲之count操作 - flowers
2021-05-25

MySQL45讲之order工作原理 - flowers

本文介绍 order 的三种排序方式,全字段排序、rowid 排序和索引树排序,以及每种排序方式具体是如何工作的。 前言本文介绍 order 的三种排序方式,全字段排序、rowid 排序和索引树排序,以及每种排序方式具体是如何工作的。当使用 explai
MySQL45讲之order工作原理 - flowers
2017-04-04

MySQL45讲之更新缓存 - flowers

本文介绍MySQL的更新缓存Change Buffer,以及唯一索引和普通索引如何选择。 前言本文介绍MySQL的更新缓存Change Buffer,以及唯一索引和普通索引如何选择。唯一索引和普通索引的选择查询过程唯一索引下,查询索引树,找到第一条匹配的
MySQL45讲之更新缓存 - flowers
2018-03-28

MySQL45讲之前缀索引 - flowers

本文介绍字符串的前缀索引优缺点,以及字符串区分度不高情况下,可以考虑如何建立索引。 前言本文介绍字符串的前缀索引优缺点,以及字符串区分度不高情况下,可以考虑如何建立索引。前缀索引对于像SELECT * FROM t WHERE email = "xxxx
MySQL45讲之前缀索引 - flowers
2020-06-03

MySQL45讲之表空间回收 - flowers

本文介绍为什么删除了一部分表数据后,表文件大小不变,以及有哪些表空间回收的方式。 前言本文介绍为什么删除了一部分表数据后,表文件大小不变,以及有哪些表空间回收的方式。为什么删除表数据后,表文件大小不变MySQL 采用的是标记删除,需要等待后台 purge
MySQL45讲之表空间回收 - flowers
2014-09-02

MySQL45讲之InnoDB加锁规则 - flowers

本文介绍 MySQL InnoDB 的加锁规则,以及分析加锁时,一些需要注意的点。 前言本文介绍 MySQL InnoDB 的加锁规则,以及一些需要注意的点。总结两个原则,两个优化,一个 bug:原则1:加锁的基本单位是 next-key 锁,是一个前开
MySQL45讲之InnoDB加锁规则 - flowers
2018-08-28

MySQL45讲之IO性能提升 - flowers

本文介绍 MySQL 的 binlog 和 redo log 写入机制和刷盘策略,以及如何提升 MySQL 的 IO 性能。 前言本文介绍 MySQL 的 binlog 和 redo log 写入机制和刷盘策略,以及如何提升 MySQL 的 IO 性能。
MySQL45讲之IO性能提升 - flowers
2015-04-27

MySQL45讲之用户关注案例 - flowers

本文介绍 MySQL45 讲中提到的一个用户关注的案例,并记录下可行的处理方案。 前言本文介绍 MySQL45 讲中提到的一个用户关注的案例,并记录下可行的处理方案。业务背景业务上有这样的需求,A、B两个用户,如果互相关注,则成为好友。存在两个表,关系(
MySQL45讲之用户关注案例 - flowers
2016-04-14

MySQL45讲之InnoDB刷脏策略 - flowers

本文介绍 InnoDB 的刷脏控制策略,它是如何控制刷脏速率的,以及一些相关参数。 前言本文介绍 InnoDB 的刷脏控制策略,它是如何控制刷脏速率的,以及一些相关参数。意义了解 MySQL 的刷脏策略有什么意义?当一条正确的 SQL 执行时偶尔延迟较高
MySQL45讲之InnoDB刷脏策略 - flowers
2018-05-10

MySQL45讲之保证高可用 - flowers

本文主要介绍 MySQL 主备延迟,延迟产生的原因和主备切换策略。 前言本文主要介绍 MySQL 主备延迟,延迟产生的原因和主备切换策略。主备延迟主备同步过程中时间点主要有三个:主库A执行完成一个事务,写入binlog,我们把这个时刻记为T1;之后传给备
MySQL45讲之保证高可用 - flowers
2017-08-07

MySQL45讲之查询慢或者阻塞 - flowers

本文介绍锁表和执行慢的例子,以及发生锁表时的排查方法。 前言本文介绍锁表和执行慢的例子,以及发生锁表时的排查方法。锁表1. 等MDL锁比如像 select * from t where id=1; 长时间不返回,可能是因为等 MDL 锁而阻塞。排查方法:
MySQL45讲之查询慢或者阻塞 - flowers
2014-12-08

MySQL45讲之主备数据一致性 - flowers

本文主要介绍 MySQL 主备数据同步的重要日志 binlog 的三种格式,和双 M 结构的循环复制问题。 前言本文主要介绍 MySQL 主备数据同步的重要日志 binlog 的三种格式,和双 M 结构的循环复制问题。binlog三种格式1. state
MySQL45讲之主备数据一致性 - flowers
2019-06-13

MySQL45讲之随机查询和临时表 - flowers

本文介绍 MySQL 随机查询的工作流程、优化随机查询的方式、和临时表。 前言本文介绍 MySQL 随机查询的工作流程、优化随机查询的方式、和临时表。工作流程根据下表结构建立 words 表,并通过过程插入 10000 条模拟数据。CREATE TABL
MySQL45讲之随机查询和临时表 - flowers
2021-03-30

MySQL45讲之优化器选错索引 - flowers

本文简要介绍优化器选择索引的依据有哪些,有什么办法人为引导优化器选择更优的执行方案。 前言本文简要介绍优化器选择索引的依据有哪些,有什么办法人为引导优化器选择更优的执行方案。为什么会出现选错索引可能是统计索引基数信息错误,导致优化器错选索引,也可能是My
MySQL45讲之优化器选错索引 - flowers
2022-03-28

MySQL45讲之备库并行复制策略 - flowers

本文主要介绍 MySQL 备库的并行复制策略。 前言本文主要介绍 MySQL 备库的并行复制策略。为什么备库需要并行复制如果主库有大量更新操作,因为主库可以并发写入,而备库只能单线程执行的话,那么备库的同步延迟会不断累加,即备库越来越追不上主库。所以,后
MySQL45讲之备库并行复制策略 - flowers
2020-10-10

MySQL45讲之生产环境下的性能问题 - flowers

本文介绍一些常见的性能问题,以及在生产环境下应该如何解决。 前言本文介绍一些常见的性能问题,以及在生产环境下应该如何解决。1. 短连接风暴当由于大量短连接造成数据库性能低时,首先考虑一些无损安全的解决方案,如果是必须立刻提升一些数据库性能,那么可以考虑下
MySQL45讲之生产环境下的性能问题 - flowers
2017-08-20

MySQL45讲之函数转换导致不使用索引 - flowers

本文介绍三种因为函数转换导致不使用索引的问题。 前言本文介绍三种因为函数转换导致不使用索引的问题。注意,不使用索引指的是不使用树搜索,而是全表扫描索引树。显式使用函数比如 select count(*) from tradelog where month
MySQL45讲之函数转换导致不使用索引 - flowers
2022-02-20

MySQL实战45讲之基础篇 - flowers

本文主要记录学习MySQL实战45讲之基础篇过程中一些新的收获,以及总结主要内容。其中包括SQL如何运行、日志系统、事务隔离、索引和锁等。 前言本文主要记录学习MySQL实战45讲之基础篇过程中一些新的收获,以及总结主要内容。其中包括SQL如何运行、日志
MySQL实战45讲之基础篇 - flowers
2016-05-09

编程热搜

目录