前言
来了来了,密码找回来了。
因为近期比较忙,同为搬砖人,那么工作肯定是优先摆在第一位的。
所以也只有利用一些零碎的时间来码一下文稿,稀碎地拼凑出 这些没有营养的杂文。
正文
想要跟锁相处好,那么锁圈内的知识也是需要了解好的。
否则与锁打招呼的方式都不知道,那么 怎么做朋友。
MySQL数据库 , 按照层级, 我们划分出三个层级 ,表 - 页 - 记录(行)。
先看图:
MySQL 支持的锁定, 也是对应有三个层级:
表级锁定 - 页级锁定 - 行级锁定
表锁
粒度最大,可避免发生死锁, 因为层级是第一层级。
举个粗俗的例子,就好像一个卫生间, 你说你想进卫生间解手, 我直接锁死门,你拿什么跟我玩? 啥时候我开门了,你才能进去。
表锁,顾名思义,一锁就是锁整张表,所以上锁实现简单、速度快、消耗资源少。
但是冲突率高,为啥,你看看上面的例子。 我锁卫生间只是洗个手而已,但是你们统统都进不去了。也就是说,并发度支持力度很低。
页锁
粒度在行级锁和表级锁中间。
上锁也快,消耗资源也不多,对比表锁来说,冲突概率减少了,一次锁定相邻的一组记录,会出现死锁。 这玩意性能来说,都算是折衷吧。
这东西用的比较少,我基本不打算怎么讲它。
BDB引擎支持页级锁。
行锁
行锁是我们这个 <跟锁做朋友系列> 的 特别关注对象。
行锁,粒度是最小的。 每次上锁,都是对操作行上锁,但是操作行指的是哪些呢,这个就根据上锁的算法去计算了。
这也是后面我们需要做朋友的几个 对象,例如 GAP、NEXT-KEY、RECORD等。
既然是行,粒度这么小,那么实现起来也就不简单,不快(消耗资源多)了。 但是因为粒度细,所以冲突小、支持并非力度大、会出现死锁。
MySQL , 有两个引擎是咱们听的比较多的。 那么这两个引擎,对于锁的支持又是如何呢?
MyISAM
只支持表级锁
而对于表级的锁定,有两种实现,即 表级共享锁 和 表级占写锁 。
InnoDB
支持表级锁
支持行级锁,具体行锁实现有哪些,我们后面篇章看。
但是我们必须的知道的点:
1.行锁 基于InnoDB 是通过给 索引上的 索引项
加锁来实现的。
2.如果没有使用到索引来检索数据,那么 就会使用表锁!
ok,开篇就讲这些, 后面的 会逐一逐一 跟看客们一起和不同的锁 做朋友。
我们后面会认识到的 锁朋友有哪些?
先随便透露一下这些 InnoDB 的 朋友 , 惯例 看图说话: