Mysql锁 InnoDB锁

186 阅读2分钟

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,+)既锁范围也锁行