MySQL锁的粒度分为:行级锁、表级锁、页级锁。

一、行级锁(INNODB引擎)

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

特点:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。

  • Record Lock,记录锁,也就是仅仅把一条记录锁上;
  • Gap Lock,间隙锁,锁定一个范围,但是不包含记录本身;
  • Next-Key Lock:Record Lock + Gap Lock 的组合,锁定一个范围,并且锁定记录本身。

二、表级锁(MYISAM引擎)

表级锁是mysql中锁定粒度最大的一种锁,表示对当前操作的整张表加锁,它实现简单,资源消耗较少,被大部分mysql引擎支持。
表级锁定分为表共享读锁(共享锁)与表独占写锁(排他锁)。
最常使用的MyISAM与InnoDB都支持表级锁定。

特点:开销小,加锁快;不会出现死锁;锁定粒度大,发出锁冲突的概率最高,并发度最低。

三、页级锁(BDB引擎)

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

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

MySQL锁的级别分为:共享锁、排他锁、意向锁。

一、共享锁(行锁)

共享锁又称:读锁、S锁,主要为了解决并发读数据的场景,读时不允许进行写的操作

当有事务对数据加了读锁后,其他事务只能对锁定的数据加读锁,不能加写锁

加锁方式 : select * from 表 where 条件=值 lock in share mode;

释放方式 : commit、rollback;

二、排他锁(行锁)

排他锁又称:独占锁、写锁、X锁,主要为了在事务进行写操作时,不允许被其他的事务修改
当事务对数据加了写锁后,其他事务不能再对数据加任何类型的锁,有写锁的事务既能读,又能写数据
加锁方式 :

自动 :增删改查操作语句默认加锁
手动 :select * from 表 where 条件=值 for update;

释放方式 : commit、rollback;

三、意向锁(表锁)

意向锁又称:I锁,主要为了在一个事务中揭示下一行将要被请求锁的类型,调高加表锁的效率
加锁方式:意向锁是InnoDB自动加的,不可以手动加

对于INSERT、UPDATE和DELETE,InnoDB 会自动给涉及的数据加排他锁;
对于一般的SELECT语句,InnoDB 不会加任何锁,事务可以通过以下语句显式加共享锁或排他锁。

表级读锁:lock table 表 read;
表级写锁:lock table 表 write;

本文主要简单介绍了mysql锁的形成及使用方法