面试真题,用通俗的例子解释清楚 MySQL 为什么有了表锁和行锁之后,还要引入意向锁
众所周知,InnoDB 中既有读锁也有写锁,也称为共享锁和排他锁,这两种锁既可以加在整张表上,也可以加在行上。
MySQL 自身就提供了表锁的能力:
-
读锁:
LOCK TABLE table_name READ
用读锁锁表,会阻塞其他事务的写操作 -
写锁:
LOCK TABLE table_name WRITE
用写锁锁表,会阻塞其他事务的读和写操作
行锁是 InnoDB 存储引擎提供的,MySQL 本身并不提供行级锁的能力:
-
读锁,如
SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE
加行级读锁,会阻塞其他事务对该行记录的写操作 -
写锁,如
SELECT * FROM table_name WHERE ... FOR UPDATE
加行级写锁,会阻塞其他事务对该行记录的的读和写操作
又有表锁又有行锁,我们来考虑下这两种类型的锁共存的问题。看下面这个例子:
事务 A 加了行级读锁,锁住了表中的一行,让这一行只能读,不能写。
之后,事务 B 尝试申请整个表的写锁。