MySQL实战45讲 第二十讲笔记

幻读

  1. 在可重复读隔离级别下,普通的查询是快照读,是不会看到别的事务插入的数据的。因
    此,幻读在“当前读”下才会出现。
  2. 幻读仅专指“新插入的行”。

产生的问题

  • 语义不同
  • 数据库一致性被破坏

如何解决

因为行锁只能锁住行,但是无法阻止新插入。
所以InnoDB引入新的锁,间隙锁

间隙锁

行间隙锁住不让插入,间隙为key不存在的范围值,但是有最大值
如果key是0,5
那么间隙锁就是(-∞,0)、(0,5)、(5,+supremum]
InnoDB 给每个索引加了一个不存在的最大值supremum

间隙锁导致的问题

select * from t where id=N for update;
/* 如果行不存在 */
insert into t values(N,N,N);
/* 如果行存在 */
update t set d=N set id=N;
commit;

一旦并发,间隙锁之间不会冲突,所以会导致死锁。InnoDB 的死锁检测马上就发现了这对死锁关系,让 session 的 insert 语句报错返回了。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1 MySQL的三种锁 1.1 表锁 开销小,加锁快 不会出现死锁 锁定粒度大,发生锁冲突的概率最高,并发度最低 ...
    JavaEdge阅读 677评论 0 1
  • 文章导读: 累兮,累兮,要死兮...... 本文解决问题: 1、表级锁定(读锁、写锁) 2、行级锁定(共享锁、排他...
    创造new_world阅读 655评论 0 1
  • 一、概述 数据库锁定机制简单来说,就是数据库为了保证数据的一致性,而使各种共享资源在被并发访问变得有序所设计的一种...
    不变甄心阅读 2,747评论 0 3
  • 为什么要学习锁机制 锁是计算机协调多个进程或线程并发访问某一资源的机制。 因为数据也是一种供许多用户共享的资源,如...
    Java架构师笔记阅读 951评论 0 7
  • 周五是我们和家长们固定见面的日子,期待家长们的到来,孩子们想要变得更好,更优秀,家长们参与进来至关重要。 除了彬彬...
    卓尔哈佛黄老师阅读 404评论 0 0