MySQL 与InnoDB 下的锁做朋友 (一) 开篇

前言


来了来了,密码找回来了。
 

 

因为近期比较忙,同为搬砖人,那么工作肯定是优先摆在第一位的。
所以也只有利用一些零碎的时间来码一下文稿,稀碎地拼凑出 这些没有营养的杂文。

 

正文

 

想要跟锁相处好,那么锁圈内的知识也是需要了解好的。

否则与锁打招呼的方式都不知道,那么 怎么做朋友。

 

MySQL数据库 , 按照层级, 我们划分出三个层级 ,表 - 页 - 记录(行)。

 先看图:

MySQL 与InnoDB 下的锁做朋友 (一) 开篇_第1张图片

MySQL 支持的锁定, 也是对应有三个层级:

表级锁定   - 页级锁定  - 行级锁定 

表锁

粒度最大,可避免发生死锁, 因为层级是第一层级。 

举个粗俗的例子,就好像一个卫生间,  你说你想进卫生间解手, 我直接锁死门,你拿什么跟我玩? 啥时候我开门了,你才能进去。 

表锁,顾名思义,一锁就是锁整张表,所以上锁实现简单、速度快、消耗资源少
但是冲突率高,为啥,你看看上面的例子。 我锁卫生间只是洗个手而已,但是你们统统都进不去了。也就是说,并发度支持力度很低
 

 

页锁

粒度在行级锁和表级锁中间。
上锁也快,消耗资源也不多,对比表锁来说,冲突概率减少了,一次锁定相邻的一组记录,会出现死锁。 这玩意性能来说,都算是折衷吧。

这东西用的比较少,我基本不打算怎么讲它。

BDB引擎支持页级锁。

 

行锁

行锁是我们这个 <跟锁做朋友系列>  的 特别关注对象。

行锁,粒度是最小的。 每次上锁,都是对操作行上锁,但是操作行指的是哪些呢,这个就根据上锁的算法去计算了。

这也是后面我们需要做朋友的几个 对象,例如 GAP、NEXT-KEY、RECORD等。

既然是行,粒度这么小,那么实现起来也就不简单,不快(消耗资源多)了。 但是因为粒度细,所以冲突小、支持并非力度大、会出现死锁

 

 

MySQL , 有两个引擎是咱们听的比较多的。 那么这两个引擎,对于锁的支持又是如何呢?

 

MyISAM 

只支持表级锁

而对于表级的锁定,有两种实现,即 表级共享锁  和  表级占写锁 。

 

InnoDB

支持表级锁

支持行级锁,具体行锁实现有哪些,我们后面篇章看。

但是我们必须的知道的点:

1.行锁 基于InnoDB 是通过给 索引上的 索引项 加锁来实现的。


2.如果没有使用到索引来检索数据,那么 就会使用表锁!

 

 

ok,开篇就讲这些, 后面的 会逐一逐一 跟看客们一起和不同的锁 做朋友。

 

 

 


我们后面会认识到的 锁朋友有哪些?

先随便透露一下这些 InnoDB 的 朋友 , 惯例 看图说话:

 

MySQL 与InnoDB 下的锁做朋友 (一) 开篇_第2张图片

 

下一篇见吧。

 

 

 

 

你可能感兴趣的:(MySQL,MySQL,锁,Innodb)