1、死锁
死锁是指两个或多个事务在同一资源上相互占用,并请求锁定对方的资源,从而导致恶性循环的现象。
2、按照锁的粒度划分
全局锁
全局锁,顾名思义,就是对整个数据库实例加锁。它是粒度最大的锁。通过执行 flush tables with read lock 指令加全局锁
释放锁
执行 unlock tables 指令,加锁的会话断开,全局锁也会被自动释放
表级锁
表锁
MySQL中锁定粒度最大的一种锁,表示对当前操作的整张表加锁,它实现简单,资源消耗较少,被大部分MySQL引擎支持。最常使用的MyISAM与InnoDB都支持表级锁定。特点:开销小,加锁快;不会出现死锁;锁定粒度大,发出锁冲突的概率最高,并发度最低。
表共享读锁(共享锁)
表独占写锁(排他锁)
元数据锁
元数据锁:metadata lock,简称MDL,它是在MySQL 5.5版本引进的。元数据锁不用像表锁那样显式的加锁和释放锁,而是在访问表时被自动加上,以保证读写的正确性。
页级锁
是MySQL中锁定粒度介于行级锁和表级锁中间的一种锁。表级锁速度快,但冲突多,行级冲突少,但速度慢。所以取了折衷的页级,一次锁定相邻的一组记录。特点:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般
行级锁
MySQL中锁定粒度最细的一种锁,表示只针对当前操作的行进行加锁。行级锁能大大减少数据库操作的冲突。其加锁粒度最小,但加锁的开销也最大。特点:开销小,加锁快;不会出现死锁;锁定粒度大,发出锁冲突的概率最高,并发度最低。
共享锁
又叫做读锁。当用户要进行数据的读取时,对数据加上共享锁。共享锁可以同时加上多个。
排他锁
又叫做写锁,当用户要进行数据的写入时,对数据加上排他锁。排他锁只可以加一个,他和其他的排他锁,共享锁都相斥。
按照锁的模式
乐观锁
假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。在修改数据的时候把事务锁起来,通过Version的方式来进行锁定。
实现方式:一般会使用版本号机制或CAS算法实现。
悲观锁
假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作。在查询完数据的时候就把事务锁起来,直到提交事务。实现方式:使用数据库中的锁机制
3、按照锁的属性
共享锁(S锁)
又叫做读锁。当用户要进行数据的读取时,对数据加上共享锁。共享锁可以同时加上多个。
排他锁(X锁)
又叫做写锁,当用户要进行数据的写入时,对数据加上排他锁。排他锁只可以加一个,他和其他的排他锁,共享锁都相斥。
4、按照锁的状态
意向共享锁(IS)
表示事务打算在表中的各个行上设置共享锁。
意向排他锁(IX)
表示事务打算对表中的各个行设置排他锁。
5、按照锁的算法
间隙锁
锁定一个范围,但不包含记录;
记录锁
是在索引记录上加锁;
临健锁(Next-Key)
它是Record Lock + Gap Lock的组合,用来锁定一个范围,并且锁定记录本身锁,它是一种左开右闭的范围,可以用符号表示为:(a,b]。
6、按照加锁的方式
自动锁(Automatic Locks)
DML 锁
锁用于控制并发事务中的数据操纵,保证数据的一致性和完整性。
保护并发情况下的数据完整性。
语句能够自动地获得所需的表级锁(TM)与行级(事务)锁(TX)。
DDL 锁
锁用于保护数据库对象的结构,如表、索引等的结构定义。
排它 DDL 锁
创建、修改、删除一个数据库对象的 DDL 语句获得操作对象的 排它锁。
共享 DDL 锁
需在数据库对象之间建立相互依赖关系的 DDL 语句通常需共享获得 DDL锁。
Systemlocks
显示锁(Lock Tables)
某些情况下,需要用户显示的锁定数据库操作要用到的数据,才能使数据库操作执行得更好,显示锁是用户为数据库对象设定的。施加写锁,写锁是排他的,不允许别的线程读和写,自己施加锁是不受影响。