锁
什么时候需要锁
当且仅当 我们有并发操作(同一时间有很多增删改的操作)
锁的分类
按照数据操作类型划分
读锁-共享锁
事务A对表加了读锁,其他事务对表继续进行加读锁:
事务A可以对表进行增删改操作,其他事务只能进行读。
写锁-排它锁
写锁只可以加一个,当前写操作没有完成前,它会阻断其他写锁和读锁。
事务A对表加了写锁,其他事务不能对表加任何类型的锁。
事务A可以进行增删改,其他事务不能进行所有操作。
按数据操作的颗粒度分类
在关系型数据库中,按数据操作的颗粒度划分,分为表锁,行锁和页锁。
表锁
MySQL中锁定粒度最大的一种锁,表示对当前操作的整张表加锁,它实现简单,资源消耗较少,被大部分MySQL引擎支持。最常使用的MyISAM与InnoDB都支持表级锁定。表级锁定分为表共享读锁(共享锁)与表独占写锁(排他锁)。
特点:表锁开销小,加锁快,无死锁,锁定粒度大,发生锁冲突的概率最高,并发最低
行锁
MySQL中锁定粒度最细的一种锁,表示只针对当前操作的行进行加锁。行级锁能大大减少数据库操作的冲突。其加锁粒度最小,但加锁的开销也最大。行级锁分为共享锁和排他锁。InnoDB存储引擎默认采用行锁。InnoDB与MyISAM的最大不同有两点:一是支持事务(TRANSACTION);二是采用了行级锁
特点:行锁开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。 InnoDB支持行级锁
页锁
页锁是MySQL中锁定粒度介于行级锁和表级锁中间的一种锁。表级锁速度快,但冲突多,行级冲突少,但速度慢。所以取了折衷的页级,一次锁定相邻的一组记录。
特点:开销和加锁时间界于表锁和行锁之间:会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。
表锁的应用
表锁对当前操作的整张表加锁,实现简单 ,资源消耗也比较少,加锁快,不会出现死锁 。触发锁冲突的概率最高,并发度最低,MyISAM和 InnoDB引擎都支持表级锁。在 MyISAM 存储引擎中,会自动为 select语句加上共享锁,为 update/delete/insert 操作加上排他锁。
锁类型 | 锁定粒度 | 资源消耗 | 加锁速度 | 死锁 | 锁冲突概率 | 并发 |
---|---|---|---|---|---|---|
表锁 | 最大 | 资源消耗小 | 速度快 | 无 | 最高 | 最低 |
行锁 | 最细 | 开销大 | 速度慢 | 有 | 最低 | 最高 |
页锁 | 居中 | 居中 | 居中 | 有 | 居中 | 一般 |