https://dev.mysql.com/doc/refman/5.6/en/innodb-lock-modes.html says:
因此,意向锁不会阻止除全表请求(例如,LOCK TABLES ... WRITE)之外的任何内容。 IX 和 IS 锁的主要目的是表明有人正在锁定一行,或者将要锁定表中的一行。
这意味着多个线程可以获取 IX 锁。这些锁位于表级,而不是行级。 IX 锁意味着持有它的线程打算更新某些行某处在表中。 IX 锁仅用于阻止全表操作。
如果您考虑到它是双向的,那么它可能会有所启发——如果正在进行全表操作,则该线程具有阻止 IX 锁的表级锁。
DML 操作必须首先获取 IX 锁,然后才能尝试行级锁。原因是您不希望在ALTER TABLE
正在进行中,或者当其他线程已经完成时LOCK TABLES...WRITE
.
行级更改如UPDATE
, DELETE
, SELECT..FOR UPDATE
不被 IX 锁阻止。它们被其他行级更改或实际的全表锁阻止(LOCK TABLES
,或某些 DDL 语句)。但除了这些表操作之外,运行 DML 的多个线程可能可以并发工作,只要它们各自处理一组不重叠的行即可。
回复您的评论:
第二SELECT...FOR UPDATE
不会阻塞等待 IX 锁,而是阻塞等待已被另一个线程中的 X 锁锁定的行上的 X(行级)锁。
我刚刚尝试过这个然后我就跑了SHOW ENGINE INNODB STATUS
这样我就可以看到被阻止的交易:
---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 上的锁主键索引表的test
。那是行级锁。
回复您的困惑LOCK IN SHARE MODE
:
你说的是three的水平SELECT
.
-
SELECT
不请求锁。没有锁阻止它,它也不会阻止其他锁。
-
SELECT ... LOCK IN SHARE MODE
请求表上的 IS 锁,然后请求与索引扫描匹配的行上的 S 锁。多个线程可以持有表上的 IS 锁或 IX 锁。多个线程可以同时持有S锁。
-
SELECT ... FOR UPDATE
请求表上的 IX 锁,然后请求与索引扫描匹配的行上的 X 锁。 X 锁是独家的这意味着他们不能让任何其他线程拥有 X 锁or同一行上有 S 锁。
但 X 锁和 S 锁都不关心 IX 锁或 IS 锁。
想想这个比喻:想象一个博物馆。
许多人,包括参观者和策展人,进入博物馆。参观者想要观看画作,因此他们佩戴了标有“IS”的徽章。策展人可能会更换画作,因此他们佩戴标有“IX”的徽章。博物馆内可以同时有很多人,同时持有两种类型的胸卡。他们不互相阻挡。
在参观期间,严肃的艺术爱好者将尽可能靠近这幅画,并进行长时间的研究。他们很高兴让其他艺术爱好者站在他们旁边,欣赏同一幅画。因此他们正在做SELECT ... LOCK IN SHARE MODE
他们有“S”锁,因为他们至少不希望在研究这幅画时被替换。
策展人可以更换一幅画,但他们对严肃的艺术爱好者很有礼貌,他们会等到这些观众完成后继续前进。所以他们正在努力做SELECT ... FOR UPDATE
(或者简单地UPDATE
or DELETE
)。他们此时将获得“X”锁,方法是悬挂一个小牌子,上面写着“展览正在重新设计”。严肃的艺术爱好者希望看到艺术以适当的方式呈现,有漂亮的灯光和一些描述性的匾额。他们会在接近之前等待重新设计完成(如果他们尝试,他们会得到锁定等待)。
此外,您可能去过博物馆,那里有更多休闲游客闲逛,试图避开其他人。他们从房间中间看画,而不是靠得太近。他们可以看到其他观众正在看的同样的画作,他们可以从严肃的艺术爱好者的肩膀上偷看,看看那些正在被观看的画作。他们甚至可能在策展人更换画作时呆呆地看着他们(他们不在乎是否看到一幅尚未正确安装和照明的画作)。所以这些偶然的访客不会阻挡任何人,也没有人阻挡他们的观看。他们只是在做SELECT
并且他们不请求任何锁。
但也有一些建筑工人应该拆除墙壁和其他东西,但当建筑物里有人时他们不会工作。他们会等待所有人离开,一旦开始工作,他们就不会让任何人进来。这就是 IS 和 IX 徽章的存在如何阻止 DDL(建筑工作)的原因,反之亦然。