文章详情

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

请输入下面的图形验证码

提交验证

短信预约提醒成功

MySQL45讲之幻读 - flowers

2018-06-06 23:44

关注

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 模式。

参考

阅读原文内容投诉

免责声明:

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

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

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯