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(建筑工作),反之亦然.