为什么要有锁?
反对对共享资源进行并发拜访,提供数据的完整性和一致性。
InnoDB 个别会在哪些地方用到锁?
InnoDB 除了在行级别上对表数据上锁外,还会在缓冲池中的 LRU 列表应用锁。
为什么要将锁进一步细化?
锁能够应答并发问题,但对于热点数据,还须要将锁细化为读锁与写锁以应答更高的并发。
其它
对于 MyISAM 引擎,其锁是表锁设置,并发状况下读是没有问题的。所以针对于只读利用,底层可选用 MyISAM 而非 InnoDB 以取得更高性能。
InnoDB 锁的类型
共享锁:S Lock,容许事务读一行数据。
排他锁:X Lock,容许事务删除或更新一行数据。
意向锁:Intention Lock,容许事务在行级上的锁和表级上的锁同时存在,意向锁将锁定对 象分为多个粒度,意向锁意为着事务心愿在更细粒度上进行加锁。
动向共享锁:IS Lock,事务想要取得一张表中某几行的共享锁。
动向排他锁:IX Lock,事务想要取得一张表中某几行的排他锁。
意向锁应用举例
若将上锁的对象看成一棵树,那么对最上层的对象上锁,也就是对最细粒度的对象上锁,那么首先须要对粗粒度的对象上锁。例如,如果须要对页上的记录 R 进行上 X 锁,那么别离须要对数据 A,表,页上意向锁 IX,最初对记录 R 上 X 锁。
InnoDB 各种锁的兼容性
IS | IX | S | X | |
---|---|---|---|---|
IX | 兼容 | 兼容 | 兼容 | 不兼容 |
IS | 兼容 | 兼容 | 不兼容 | 不兼容 |
S | 兼容 | 不兼容 | 兼容 | 不兼容 |
X | 不兼容 | 不兼容 | 不兼容 | 不兼容 |