为什么要有锁?
支持对共享资源进行并发访问,提供数据的完整性和一致性。


InnoDB一般会在哪些地方用到锁?
InnoDB除了在行级别上对表数据上锁外,还会在缓冲池中的LRU列表使用锁。


为什么要将锁进一步细化?
锁可以应对并发问题,但对于热点数据,还需要将锁细化为读锁与写锁以应对更高的并发。


其它
对于MyISAM引擎,其锁是表锁设置,并发情况下读是没有问题的。所以针对于只读应用,底层可选用MyISAM而非InnoDB以获得更高性能。


InnoDB锁的类型
共享锁:S Lock,允许事务读一行数据。
排他锁:X Lock,允许事务删除或更新一行数据。
意向锁:Intention Lock,允许事务在行级上的锁和表级上的锁同时存在,意向锁将锁定对 象分为多个粒度,意向锁意味着事务希望在更细粒度上进行加锁。
意向共享锁:IS Lock,事务想要获得一张表中某几行的共享锁。
意向排他锁:IX Lock,事务想要获得一张表中某几行的排他锁。

意向锁使用举例
若将上锁的对象看成一棵树,那么对最下层的对象上锁,也就是对最细粒度的对象上锁,那么首先需要对粗粒度的对象上锁。例如,如果需要对页上的记录R进行上X锁,那么分别需要对数据A,表,页上意向锁IX,最后对记录R上X锁。

意向锁的目的是为了快速判断自己能否获取锁。比如事务A想对某一行加X锁,但事务B已经在表上加了S锁,所以事务A需要对申请表锁的IX锁,由于IX与S不兼容,所以事务A的操作会被阻塞。这里事务A不需要通过检测具体某一行是否有其它事务加了锁,这样性能很差,而只需要检查表锁即可。
此示例来源于《mysql技术内幕 InnoDB存储引擎》一书。

相关内容可以参考下意向锁

本文来自于《mysql技术内幕 InnoDB存储引擎》一书


步履不停
38 声望14 粉丝

好走的都是下坡路