InnoDB 的意向锁有什么作用?
关注者
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锁也同理。