MySQL InnoDB存储引擎支持以下几种锁:
- 共享锁(Shared Locks):允许事务读取一行,阻止其他事务获取排它锁。共享锁之间不互斥。
sql
SELECT * FROM table1 WHERE ... LOCK IN SHARE MODE;
- 排它锁(Exclusive Locks):允许事务更新或删除一行,阻止其他事务获取共享锁或排它锁。
sql
SELECT * FROM table1 WHERE ... FOR UPDATE;
- 意向共享锁(Intention Shared Lock):事务打算为一行的子集获取共享锁,表示其他事务可以获取该行的共享锁和意向共享锁,但不能获取排它锁。
自动获取,不需要手动设置。 - 意向排它锁(Intention Exclusive Lock):事务打算为一行的子集获取排它锁,表示其他事务不能获取该行的任何锁。
自动获取,不需要手动设置。 - 自动排他锁(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存储引擎采用多粒度锁定,可以锁定行、页以及表,灵活控制并发度。