回答
InnoDB 行级锁作用于数据库表的单行,粒度更小,有助于降低锁竞争,提高并发性。实现机制如下:
**1、存储引擎。**MySQL 行级锁在存储引擎层实现,InnoDB 支持行锁,而 MyISAM 不支持行锁。
2、加锁机制。InnoDB 行锁是对索引上的索引项进行加锁,而非针对记录加锁。也就是说只有通过索引条件检索数据,InnoDB 才会使用行级锁;否则,InnoDB 将使用表锁。
3、基本单位。InnoDB 行级锁加锁的基本单位是临键锁(Next-key Lock,临键锁 = 记录锁 + 间隙锁)。它是解决幻读,确保可重复读(RR,默认事务隔离级别)的关键。当使用记录锁(Record Lock)或间隙锁(Gap Lock)能避免幻读,临键锁便会退化为记录锁或间隙锁。
**4、两阶段锁协议。**在 InnoDB 事务中,行锁是在需要的时候加上的,但并非是不需要了就立刻释放,而是要等到事务结束时才释放。这就是两阶段锁协议。
如上,由于行记录id = 10
被事务 A 锁定,事务 B 会一直被阻塞直至事务 A 提交。因此,对于需锁定多行的事务,建议把最可能造成锁冲突、最可能影响并发度的锁尽量往后放。