意向锁是为了提高加表级锁的效率,即如果你的事务涉及到给表加锁,则才会涉及到意向锁。
示例:表t 事务A 事务B
事务A
select * from t where id =1 for update
即先获取表t的意向排他锁,在获取表的 id=1 排它锁(行锁)
事务B
LOCK TABLES t READ ;
想获取表t的共享表锁,此时发现事务A已经获取了t的意向排它锁,因此只能阻塞。如果没有意向锁,事务B需要遍历表t的每一行,看有没有事务占有锁,效率低下。
如果事务c
select * from t where id =2 for update
即先获取表t的意向排他锁,在获取表的 id=2 排它锁(行锁),由于意向锁之间不排斥,且id=1 和id=2的行锁不排斥,因此事务c不阻塞
搬运工:https://juejin.cn/post/6844903666332368909