InnoDB 的意向锁有什么作用?

mysql官网上对于意向锁的解释中有这么一句话“The main purpose of IX and IS locks is to show that…
关注者
210
被浏览
161,901
登录后你可以
不限量看优质回答私信答主深度交流精彩内容一键收藏

意向锁就好像给表加上一个警示牌,每当要锁记录时,都会竖起这块牌子,上面写着,“警告,此表中已有记录被上锁,锁表时注意点!”

假设表中有1000万条数据,事务T1获得了一条记录行x锁,事务T2执行 select * from xxx lock in share mode, 这条语句需要拿表s锁,表s锁与表x锁,记录x锁是不相容的,此时存在如下两个问题:

1.如何知道表x锁是否被占用

2.如何知道此时1000万条数据中是否存在任意记录的x锁被占用


对于问题1,很好解决,只需看下表锁的状态标志位。

对于问题2,一个笨办法是遍历1000万条记录,挨个检查每条记录对应的的锁状态。时间复杂度n,很显然这个办法相当低效。

另一个高效办法是,维护一个表级状态,每当获得记录x锁时,都设置这个状态设置为“已获取该表行级x锁”

这样在获取表级s锁时,就只需检测一下这个表级状态,就可知“1000万条数据中是否有任意记录的x锁被占用”。而这个“状态”就是ix意向锁,相比较于前面的笨办法,时间复杂度n降为1。

is锁也同理。