文章预览
首先来看这个面试题: 已知表t是 innodb 引擘,有主键:id( int类型 ),下面3条语句是否加锁?加锁的话,是什么锁? select * from t where id=X; begin;select * from t where id=X; begin;select * from t where id=X for update; 这里其实有很多依赖条件,并不能一开始就给出一个很确定的答复。我们一层层展开来分析。 01 MySQL 有哪些锁? 首先要知道 MySQL 有哪些锁。如上图所示,至少有12类锁。 其中, 自增锁 是事务向包含了 AUTO_INCREMENT 列的表中新增数据时会持有, predicate locks for spatial index 为空间索引专用,本文不讨论这2类锁。 锁按粒度可分为全局、表级、行级,共3类。 1.1 全局锁 对整个数据库实例加锁。 加锁表现:数据库处于只读状态,阻塞对数据的所有 DML/DDL 加锁方式: Flush tables with read lock 释放锁: unlock tables (发生异常时会自动释放) 作用场景:全局锁主要用
………………………………