Fork me on GitHub

mysql 锁

锁的类型

  1. 不同实现 : 悲观锁 / 乐观锁
  2. 锁的粒度 : 全局锁 / 表锁 / 行锁
  3. 锁的程度 : 共享锁 / 排他锁 / 意向锁 / 记录锁 / 间隙锁 / 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 冲突 冲突 冲突 冲突
  1. 意向锁之间不冲突, 两两互相兼容
  2. 意向S锁和意向X锁存在冲突, 冲突逻辑同S锁与X锁的冲突逻辑
posted @ 2021-12-17 09:50  llbrh  阅读(36)  评论(0)    收藏  举报