结论:当一个事务要对表进行锁定时,首先会获取相应的意向锁。其他事务可以通过检查意向锁来判断是否有其他事务在更细粒度的级别上对表进行了锁定。这有助于避免冲突和提高并发性能

在讨论此问题之前我们应当明确两个前提:

  1. Innodb存储引擎支持行锁和表锁共存
  2. 行锁与表锁之间互不冲突

意向锁是表级别的锁,意向锁之间、意向锁与表级别的共享锁、排他锁的兼容性关系如下:

 

假设目前有一张业务表t_business,主键b_id,在某种业务场景下 事务A需要对数据行增加排他锁

SELECT xxx,xxx FROM t_business WHERE b_id = x FOR UPDATE;

此时 事务A实际上持有了两把锁 一个是表t_business的表级的意向排他锁,一个是b_id=x的行级排他锁

之后 事务B来了,想对表t_business加表级别的共享锁,由于共享锁和排他锁互斥,因此事务B在对表加共享锁之前需要明确:表上是否有行级/表级 排他锁,由于事务A持有了表t_business的意向排他锁,因此事务B无需再去逐行分析是否有数据被持有行级排他锁,提升了效率。