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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值