InnoDB锁
InnoDB锁类型
InnoDB存储引擎支持表级锁、行级锁
InnoDB存储引擎默认使用行级锁
InnoDB行锁机制
InnoDB表级锁类-意向锁(解决表级锁在加锁时的互斥检测)
一个事务要对表A加表级共享锁(表级排它锁),必须保证:
- 当前没有其他事务持有 A 表的排他锁(共享锁和排它锁)
- 当前没有其他事务持有 A 表中任意一行的排他锁(共享锁和排它锁)
为了检测是否满足第二个条件,该事务必须去检测表中的每一行是否存在排他锁(共享锁和排它锁),很明显这是一个效率很差的做法;但是有了意向锁之后,只要检测表级意向排他锁(意向共享锁和意向排它锁)就可以了
意向锁是有数据引擎自己维护的,用户无法手动操作意向锁,在为数据行加共享锁、排他锁之前,InnoDB会先获取该数据行所在数据表的对应意向锁
意向锁不会与行级的共享 / 排他锁互斥,只会与表级共享锁 / 排他锁互斥;表级锁包括 基本表锁、自增锁
DQL和DML操作涉及到行级锁的互斥,由行级锁机制进行检测和处理;互斥则等待锁释放
InnoDB表级锁-自增锁(保证AUTO_INCREMENT列连续)
InnoDB表级锁-自增锁-主键冲突场景:
InnoDB行级锁-基本行锁
InnoDB行级锁-行锁(InnoDB行级锁按照影响范围区分)
InnoDB行级锁-临键锁(next-key locks)、间隙锁(gap locks):
假如有个索引是:[1,2,3,7]
record lock 锁的是 1,2,3,7
gap lock 锁的是 (-,1),(2,3),(3,7),(7,+)锁的就是区间,不是行
next-key lock锁的是 (-,1],[2,3),[3,7),[ 7,+)既锁范围也锁行