按照锁的粒度分为表锁,页锁,行锁
表锁
表级锁是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的锁实现