MySQL中的InnoDB引擎支持哪些锁?

MySQL InnoDB存储引擎支持以下几种锁:

  1. 共享锁(Shared Locks):允许事务读取一行,阻止其他事务获取排它锁。共享锁之间不互斥。
sql
SELECT * FROM table1 WHERE ... LOCK IN SHARE MODE;
  1. 排它锁(Exclusive Locks):允许事务更新或删除一行,阻止其他事务获取共享锁或排它锁。
sql
SELECT * FROM table1 WHERE ... FOR UPDATE;
  1. 意向共享锁(Intention Shared Lock):事务打算为一行的子集获取共享锁,表示其他事务可以获取该行的共享锁和意向共享锁,但不能获取排它锁。
    自动获取,不需要手动设置。
  2. 意向排它锁(Intention Exclusive Lock):事务打算为一行的子集获取排它锁,表示其他事务不能获取该行的任何锁。
    自动获取,不需要手动设置。
  3. 自动排他锁(Automatic Exclusive Lock):当事务更新或删除一行时自动获取,阻止其他事务访问该行。
    自动获取,不需要手动设置。

例1:会话1获取共享锁,会话2也可以获取共享锁,但是不能获取排它锁。
会话1:

sql
SELECT * FROM table1 WHERE ... LOCK IN SHARE MODE; 

会话2:

sql
SELECT * FROM table1 WHERE ... LOCK IN SHARE MODE;   # 成功
SELECT * FROM table1 WHERE ... FOR UPDATE;         # 阻塞,等待会话1释放共享锁

排它锁会阻塞其他会话获取的任何锁,实现事务隔离,保证数据一致性。共享锁则可以允许其他会话也获取共享锁,实现读的并发性。
InnoDB存储引擎采用多粒度锁定,可以锁定行、页以及表,灵活控制并发度。