mysql有哪些锁&什么场景下会触发这些锁&如何用这些锁

834 阅读2分钟

按照锁的粒度分为表锁,页锁,行锁

表锁

表级锁是MySQL中锁定粒度最大的一种锁,表示对当前操作的整张表加锁,它实现简单,资源消耗较少,被大部分MySQL引擎支持。最常使用的MYISAM与INNODB都支持表级锁定。表级锁定分为表共享读锁(共享锁)与表独占写锁(排他锁)
特点:开销小,加锁快;不会出现死锁;锁定粒度大,发出锁冲突的概率最高,并发度最低

页锁

页级锁是MySQL中锁定粒度介于行级锁和表级锁中间的一种锁。表级锁速度快,但冲突多,行级冲突少,但速度慢。所以取了折衷的页级,一次锁定相邻的一组记录。

特点:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般

行锁

行级锁是Mysql中锁定粒度最细的一种锁,表示只针对当前操作的行进行加锁。行级锁能大大减少数据库操作的冲突。其加锁粒度最小,但加锁的开销也最大。行级锁分为共享锁 和 排他锁。

特点:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高 实现原理: 基于索引实现
select * from user_info where id = 1 for update;
id列如果加索引了则是行锁,如果该列没有索引,就会使用表锁

按照锁的类别分为读锁,写锁

读锁又叫共享锁,可以同时加多个读锁,互不影响
写锁又叫排它锁,只能同时加一个,与其他写锁互斥

间隙锁&next-key lock

record lock 记录锁

单个行记录上的锁

gap lock 间隙锁

间隙锁,锁定一个范围,不包括记录本身

next-key lock

record+gap 锁定一个范围,包含记录本身。用于解决幻影读

乐观锁&悲观锁

乐观锁

假定其他事务不会对数据有修改,只有在提交时才会去检查数据是否有修改,一般使用版本号的机制来实现

悲观锁

假定会发生冲突,在查询完数据的时候把事务锁起来,知道提交事务,使用mysql的锁实现