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各种锁详解