意向锁的作用

背景

在了解innodb事务并发控制的时候,里面提到了意向锁(intention lock),这里简单做下总结

应用场景

在innodb的使用场景中,里面有实现了行锁,具体有对行的读锁,写锁。另外,如果对一个表作一些统一的操作,表的层面,有表层级的读锁,写锁。那这个意向锁是干嘛用的?

我们假设一个场景,一个事务A正在写某个表T的第r行加了写锁,另一个事务B尝试去对整个表做操作(例如修改表结构的时候),B尝试去对整个表加一个写锁。则此时,需要执行两个步骤:
1)检查表T是否被上了读锁或者写锁。
2)遍历所有行,查看每一行是否被上了读锁或写锁。
步骤1可以很快执行,但是步骤2,则需要非常耗时,效率低下。此时,意向锁出场了

使用逻辑

意向锁的作用,相当于就是在低层次资源是否使用,加了一个tag来标识而已。对于步骤2的执行可以大大加速,仅此而已。
有了意向锁之后,事务A的操作步骤如下:
1)事务A上行锁时,先对表上一个写意向锁。
2)事务A对r行上一个写锁。

事务B想对表上写锁,操作步骤如下:
1)检查表T是否被上了读锁或写锁。
2)检查表是否被上了意向锁(因为所有行的读写之前,会先上意向锁),即可判断表中是否有任何一行被上了读锁或写锁。
步骤2在检查逻辑的时间复杂度,由于增加了意向锁之后,时间复杂度由O(n),提升到了O(1),效率大幅提升。另外,从这个逻辑来看,读和写的意向锁,两者是彼此兼容,当时读到这他们之间的兼容关系的时候,一直不太理解,没理解到点上。

总结

意向锁的设计目的,只是为了方便上层资源检查下层资源是否有被占用的加速设计,本身并不能增加并发度。
从意向锁的设计思路来看,我们在系统对层次资源的并发使用的时候,也是可以参数意向锁的设计思路,做到触类旁通,真正提升技术方案的理解水平!

你可能感兴趣的:(工作,linux,数据库)