mysql 锁
锁的类型
- 不同实现 : 悲观锁 / 乐观锁
- 锁的粒度 : 全局锁 / 表锁 / 行锁
- 锁的程度 : 共享锁 / 排他锁 / 意向锁 / 记录锁 / 间隙锁 / Next-Key 锁 / 插入意向锁 / 自增锁
全局锁:锁的是整个database。由MySQL的SQL layer层实现的
表级锁:锁的是某个table。由MySQL的SQL layer层实现的
⾏级锁:锁的是某⾏数据,也可能锁定⾏之间的间隙。由某些存储引擎实现,⽐如InnoDB
悲观锁 : 总是假设最坏情况发生, 在数据库层加锁, 每次并发都会阻塞
乐观锁 : 假设出现冲突的概率较小, 适合读多写少的场景; 不使用数据库锁机制, 而是使用数据本身来校验是否产生冲突
共享锁 : 允许持有锁事务读取行
排他锁 : 允许持有锁事务更新或删除行。
记录锁 : 记录锁是对索引记录的锁
意向锁 : 表示接下来将对指定数据加的锁, 发生在S锁和X锁请求之前; 意向锁是表锁
间隙锁 : 对指定索引范围的间隙加锁
AUTO-INT 锁 : 对设置AUTO_INCREMENT的表进行insert会获得 自增锁
表级锁类型兼容性
S锁 表示共享锁 X锁 表示排他锁 IS 表示意向共享锁; IX 表示意向排他锁
S锁和X锁的冲突 :
事务1持有S锁, 允许事务2同时对该数据持有S锁, 不允许对该数据持有X锁
事务1持有X锁, 不允许事务2对该数据持有任何锁; 需等待事务1释放X锁后才能加锁
| 加锁冲突 | IS | IX | S | X |
|---|---|---|---|---|
| IS | 兼容 | 兼容 | 兼容 | 冲突 |
| IX | 兼容 | 兼容 | 冲突 | 冲突 |
| S | 兼容 | 冲突 | 兼容 | 冲突 |
| X | 冲突 | 冲突 | 冲突 | 冲突 |
- 意向锁之间不冲突, 两两互相兼容
- 意向S锁和意向X锁存在冲突, 冲突逻辑同S锁与X锁的冲突逻辑

浙公网安备 33010602011771号