https://dev.mysql.com/doc/refman/5.6/en/innodb-lock-modes.html说:

Thus, intention locks do not block anything except full table requests (for example, LOCK TABLES … WRITE). The main purpose of IX and IS locks is to show that someone is locking a row, or going to lock a row in the table.

这意味着多个线程可以获取IX锁.这些锁位于表级,而不是行级. IX锁意味着持有它的线程打算更新表中某处的某些行. IX锁仅用于阻止全表操作.

如果你认为它是双向的,它可能会有所帮助 – 如果正在进行全表操作,那么该线程有一个阻止IX锁的表级锁.

DML操作必须先获取IX锁,然后才能尝试行级锁.原因是您不希望在ALTER TABLE正在进行时允许DML,或者其他一些线程已经完成LOCK TABLES … WRITE.

IX锁定不会阻止UPDATE,DELETE,SELECT..FOR UPDATE等行级更改.它们被其他行级更改或实际的完整表锁(LOCK TABLES或某些DDL语句)阻止.但是除了那些表操作之外,运行DML的多个线程可能同时工作,只要它们每个都处理一组不重叠的行.

你的评论:

第二个SELECT … FOR UPDATE没有被阻塞等待IX锁,它被阻塞等待已经被另一个线程中的X锁锁定的行上的X(行级)锁.

我刚尝试了这个,然后我运行了SHOW ENGINE INNODB状态,这样我就可以看到被阻止的事务:

---TRANSACTION 71568, ACTIVE 12 sec starting index read

mysql tables in use 1, locked 1

LOCK WAIT 2 lock struct(s), heap size 1136, 1 row lock(s)

MySQL thread id 10, OS thread handle 140168480220928, query id 288 localhost root statistics

select * from test where id=1 for update

------- TRX HAS BEEN WAITING 12 SEC FOR THIS LOCK TO BE GRANTED:

RECORD LOCKS space id 802 page no 3 n bits 72 index `PRIMARY` of table `test`.`test`

trx id 71568 lock_mode X locks rec but not gap waiting

看到?它说它正在等待在表测试的主键索引上使用lock_mode X授予锁定.这是一个行级锁定.

关于LOCK IN SHARE MODE的困惑:

你在谈论SELECT的三个层次.

> SELECT请求没有锁.没有锁阻止它,它不会阻止其他锁.

> SELECT … LOCK IN SHARE MODE请求表上的IS锁定,然后S锁定与索引扫描匹配的行.多个线程可以在表上保存IS锁或IX锁.多个线程可以同时保存S锁.

> SELECT … FOR UPDATE请求表上的IX锁,然后X锁定与索引扫描匹配的行. X锁是独占的,这意味着它们不能让任何其他线程在同一行上具有X锁或S锁.

但X和S锁都不关心IX或IS锁.

想想这个比喻:想象一下博物馆.

许多人,包括访客和策展人,都进入了博物馆.参观者想要观看绘画,因此他们佩戴标有“IS”的徽章.策展人可能会更换油画,因此他们会佩戴一张标有“IX”的徽章.博物馆里可以同时有很多人,有两种类型的徽章.它们不会相互阻挡.

在他们的访问期间,严肃的艺术爱好者将尽可能地接近绘画,并研究它很长一段时间.在同一幅画之前,他们很高兴让其他艺术爱好者站在他们旁边.因此他们正在做SELECT … LOCK IN SHARE MODE并且他们有“S”锁,因为他们至少不希望在他们研究它时更换它.

策展人可以取代一幅画,但他们对严肃的艺术爱好者很有礼貌,他们会等到这些观众完成并继续前进.所以他们试图做SELECT … FOR UPDATE(或者只是UPDATE或DELETE).他们此时会获得“X”锁,挂上一点点注意“展品被重新设计”.严肃的艺术爱好者希望以适当的方式呈现艺术,具有良好的灯光和一些描述性的匾额.他们会等待重新设计在他们接近之前完成(如果他们尝试,他们会等待锁定).

此外,你可能已经进入了一个博物馆,那里有更多的休闲游客,试图远离其他人的方式.他们看着房间中间的画作,而不是接近太近.他们可以看到其他观众正在看的同样的画作,他们可以偷看严肃艺术爱好者的肩膀,看看那些被观看的画作.当他们更换画作时,他们甚至可能会对策展人嗤之以鼻(如果他们瞥见一幅尚未正确安装和点亮的画作,他们也不在乎).因此,这些随意的访客不会阻止任何人,也没有人阻止他们的观看.他们只是做SELECT而他们不要求任何锁.

但也有建筑工人应该拆除墙壁和东西,但他们不会工作,而建筑物中有任何人.他们会等待每个人离开,一旦他们开始工作,他们就不会让任何人进入.这就是IS和IX徽章的存在阻止DDL(建筑工作),反之亦然.

mysql x ix_mysql – 为什么IX-lock与InnoDB中的另一个IX-lock兼容?相关推荐

  1. MySQL笔记-死锁原理与分析及InnoDB中如何减少死锁

    根据InnoDB的加锁规则(Record Lock.Gap Lock.meta data lock)可以写出不会发生死锁的SQL语句,也能定位出产生死锁的原因. 死锁产生的原因: 产生回路:两个或两个 ...

  2. mysql 查询每天某个时间段的数据_mysql 中,统计一个时间段内每天8时到12时的数据的查询语句怎么写?...

    比如 2012-12-11 8:00:00-12:00:00 到 2012-12-13 8:00:00-12:00:00 这3天内,8点到12点. 查询语句怎么写? 自己写出来了.EXPLAIN SE ...

  3. MySQL笔记-InnoDB中Record Lock与Gap Lock

    锁:用于在多个事务访问同一个对象时根据这些操作访问同一对象的先后次序给事务排序. 不同数据库的锁实现: InnoDB:行级锁: Oracle:行级锁: MyISAM:表级锁: Microsoft SQ ...

  4. mysql mvcc undo_Mysql Innodb中undo-log和MVCC多版本一致性读 的实现

    http://blog.sina.com.cn/s/blog_4673e603010111ty.html 本文主要介绍mysql中innodb引擎undo-log和事务中MVCC多版本一致性读的实现. ...

  5. 一文了解Innodb中的锁

    对于大部分的后端开发来说,数据库尤其是MySQL是一个离不开的知识点,那么今天就分享一下最近学习的数据库中的锁相关知识,并以此解释事务隔离性问题. 如下是整理的Mysql中锁的相关知识点 什么是锁 锁 ...

  6. 详解 MySql InnoDB 中意向锁的作用

    2019独角兽企业重金招聘Python工程师标准>>> 详解 MySql InnoDB 中意向锁的作用 前言 InnoDB 支持多粒度锁(multiple granularity l ...

  7. MySQL怎么运行的系列(十)Innodb中的锁:记录锁、临键锁、间隙锁、意向锁

    本系列文章目录 展开/收起 MySQL怎么运行的系列(一)mysql体系结构和存储引擎 MySQL怎么运行的系列(二)Innodb缓冲池 buffer pool 和 改良版LRU算法 Mysql怎么运 ...

  8. MySQL(九):锁、表锁、行级锁、Gap Lock、Next-Key Lock

    目录 一.锁 1.1 并发事务访问记录的三种方式 1.2 写-写情况 1.3 读-写情况 1.4 一致性读 1.4 共享锁和独占锁 1.5 多粒度锁 1.6 MySQL中的行锁和表锁 二.InnoDB ...

  9. MySQL/InnoDB中,乐观锁、悲观锁、共享锁、排它锁、行锁、表锁、死锁概念的理解

    MySQL/InnoDB的加锁,一直是一个面试中常问的话题.例如,数据库如果有高并发请求,如何保证数据完整性?产生死锁问题如何排查并解决?我在工作过程中,也会经常用到,乐观锁,排它锁,等.于是今天就对 ...

  10. mysql中的意向锁IS,IX

    知识储备: 1.官方文档上说mysql是支持非锁定读的:这个功能是这样实现的,如果事务a 要对行的数据进行更新的话,那么事务a要得到行的x锁,并把这一行  之前的样子记录在undo log里面,这样一 ...

最新文章

  1. mysql 同样字段的索引_MySQL表中具有相同字段的两个索引
  2. 左值、右值、左值引用、右值引用
  3. Oracle中NUMBER类型如果不指定长度和小数点精度默认是多长
  4. 在php100 防恶意注册这个需要怎么填,WordPress防止恶意注册代码
  5. 初级程序员需要接触好的架构代码
  6. 数据可视化【二】HTML+CSS+SVG+D3
  7. 假期读书|《步履不停》读后感
  8. OutOfMemoryError(内存溢出)解决办法
  9. golang fatal error: all goroutines are asleep - deadlock!
  10. 什么是java socket_java 网络编程,Socket编程
  11. Codejock Suite Pro _16.3.X.国内最新版来了!
  12. Chrome网页视频加速器介绍
  13. java动物继承_java 编码实现动物世界的继承关系:动物(Animal)属性:名称(name)具有行为:吃(eat)、睡觉(sleep)...
  14. 自定义组件时 Binary XML file line Error inflating class 异常
  15. 点阵发光管怎么用C语言编程,LED点阵经验各种点阵驱动方法讲解
  16. php文件 怎么写韩文,php插入韩文txt文件内的数据,SQL-Front显示乱码
  17. this的指向问题总结
  18. 贵州省发票认证系统服务器地址,贵州省增值税发票综合服务平台登录入口:https://fpdk.guizhou.chinatax.gov.cn...
  19. “金山云感知城市”在重庆智博会发布 加速推动智慧城市发展
  20. 用php编写多项选择题_php 多选框问题(类似一道多选题)多选题的答案 以及正确答案都记录到数据库里了,读取修改问题...

热门文章

  1. wifi握手包自动跑包
  2. 做祛痘产品微信是如何引流的?祛斑祛痘产品引流加粉渠道有哪些?
  3. 博弈论、竞价机制和AI
  4. 三消类游戏的核心算法
  5. 获取汉字拼音首字母方法
  6. 微软解决Office兼容性问题 补丁包 转帖之www.it.com.cn
  7. linux安装lsi raid卡驱动下载,【LSIRAID卡驱动下载】LSIRAID卡官方驱动程序下载
  8. android JeckPack官方文档学习
  9. 2021年危险化学品经营单位安全管理人员考试总结及危险化学品经营单位安全管理人员作业考试题库
  10. 那些便宜的vps,你敢用吗?企业该如何选择云服务器?