什么时候需要锁

当且仅当 我们有并发操作(同一时间有很多增删改的操作)

锁的分类

按照数据操作类型划分

读锁-共享锁

事务A对表加了读锁,其他事务对表继续进行加读锁:

事务A可以对表进行增删改操作,其他事务只能进行读。

写锁-排它锁

写锁只可以加一个,当前写操作没有完成前,它会阻断其他写锁和读锁。

事务A对表加了写锁,其他事务不能对表加任何类型的锁。

事务A可以进行增删改,其他事务不能进行所有操作。

按数据操作的颗粒度分类

在关系型数据库中,按数据操作的颗粒度划分,分为表锁,行锁和页锁。

表锁

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

行锁

MySQL中锁定粒度最细的一种锁,表示只针对当前操作的行进行加锁。行级锁能大大减少数据库操作的冲突。其加锁粒度最小,但加锁的开销也最大。行级锁分为共享锁和排他锁。InnoDB存储引擎默认采用行锁。InnoDB与MyISAM的最大不同有两点:一是支持事务(TRANSACTION);二是采用了行级锁
特点:行锁开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。 InnoDB支持行级锁

页锁

页锁是MySQL中锁定粒度介于行级锁和表级锁中间的一种锁。表级锁速度快,但冲突多,行级冲突少,但速度慢。所以取了折衷的页级,一次锁定相邻的一组记录。
特点:开销和加锁时间界于表锁和行锁之间:会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。

表锁的应用

表锁对当前操作的整张表加锁,实现简单 ,资源消耗也比较少,加锁快,不会出现死锁 。触发锁冲突的概率最高,并发度最低,MyISAM和 InnoDB引擎都支持表级锁。在 MyISAM 存储引擎中,会自动为 select语句加上共享锁,为 update/delete/insert 操作加上排他锁。

锁类型 锁定粒度 资源消耗 加锁速度 死锁 锁冲突概率 并发
表锁 最大 资源消耗小 速度快 最高 最低
行锁 最细 开销大 速度慢 最低 最高
页锁 居中 居中 居中 居中 一般
posted @ 2023-07-13 21:09  YxinHaaa  阅读(44)  评论(0编辑  收藏  举报