MYSQL锁
锁原理
锁分类
按模式分类
乐观锁
定义: 乐观锁是在假设不会发生并发冲突,只是在提交时检查是否违反数据完整性。 实现层面: 业务代码自己实现 使用场景: 并发量小 机制: 提交更新时检查版本号或者时间戳是否符合
悲观锁
定义: 悲观锁是在假设一定会发生并发冲突,屏蔽一切可能违反数据完整性的操作。 机制: 表锁,行锁等 实现层面: 数据库本身 适用场景: 并发量大的情况。
按粒度分类
全局锁
全局锁一般是在对数据库操作的时候使用上,如备份数据库或者恢复数据库等。
表锁
隐式上锁(默认,自动加锁,自动释放)
显示上锁
实现方式:
显式添加共享锁: select * from user lock in share mode
显示添加排它锁: select * from user for update
解锁方式: 1. 提交事物(commit) 2. 回滚事物(rolback) 3. kill阻塞进程
表锁分类![[WeChat146d352dc0b3c0c10897bab560a82ebd.png]]
表级锁的兼容性
共享锁(s) OR 读锁
机制: 允许一个事物去读取一行,阻止其他事物获得相同数据集的排他锁。
排它锁(X) OR 写锁
机制: 允许获得拍排它锁的事务更新数据,阻止其他事务获得相同数据集的共享锁和排它锁。
意向共享锁(ISj)
机制: 一个事物给一个数据行加共享锁时,必须先获得该表的IS锁。
意向排它锁(IX)
机制: 一个事物给一个数据行加排它锁时,必须先获得该表的IX锁。
MDL锁
用处: MDL锁用于解决或者保证DDL操作与DML操作之间的一致性。 介绍:MDL锁是表级锁的一种,在执行DDL的时候时候会加加上MDL读锁,在对表结构做更改的时候会对MDL加上写锁。
页锁
在bdb存储引擎中实现,不过多讨论
行锁
行锁分类
共享锁(s) OR 读锁
机制: 允许一个事物去读取一行,阻止其他事物获得相同数据集的排他锁。
排它锁(X) OR 写锁
机制: 允许获得拍排它锁的事务更新数据,阻止其他事务获得相同数据集的共享锁和排它锁。
按属性
共享锁 (select … lock in share mode)
排它锁 (select … for update)
按状态
意向共享锁
意向排它锁
按算法
间隙锁
记录锁
临键锁
![[截屏2022-07-10 下午6.00.22.png]]
参考: 史上最全MySQL各种锁详解