开发者学堂课程【MySQL 实操课程:MySQL 下不同存储引擎下锁的不同表现形式】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/717/detail/12817
MySQL 下不同存储引擎下锁的不同表现形式
一、MYSQL
1、MySQL 下不同存储引擎下,锁的不同表现形式
(1)锁定义与 MySQL 不同存储引擎下锁的表现形式
数据库锁机制简单来说,就是数据库为了保证数据的一致性,使各种共享资源在被并发访问时变得有序而设计的一种规则;
详解:
主要是对比事物,事物就是为了保证数据的一致性,如何确保在 MySQL 并发访问下的一致性?事物只能保证当前事物的一致性,并不能保证并发的,所以引出了锁,在资源并发访问时变得有序。
(2)MySQL 不同的存储引擎支持不同的锁机制
①In no DB 支持行锁,有时会升级为表锁; My ISAM 只支持表锁;
②表锁:开销较小、加锁较快;不会出现死锁;锁粒度较大,发生锁冲突概率较高,并发较低;
③行锁:开销较大、加锁较慢;会出现死锁;锁粒度较小,发生锁冲突概率较低,并发较高。
详解:
在某个表中每行表中都有单独的数据,对表加锁并不会对整个表加锁,这种现象可能会出现死锁,特别是在相互等待的情况下;MySQL 数据库对死锁会有自动处理机制和超时机制,并会无限阻塞。从另一个角度讲,此锁分别为显示锁和隐示锁,之前所讲的隐示提交和显示提交便与之对应,隐示是指大家不需要手动加锁,本身会加锁;显示就需要手动加锁。
My ISAM 只支持表锁指的是 My ISAM 在执行查询和更新操作时,会使用到隐示添加表锁,隐示锁不但不受数据库开发人员的控制,并且生命周期短暂,为了延长表锁的生命周期,会显示的去添加表锁或显示解锁。
(3)举例:如何给 MySQL 表施加表级锁?
①打开 shell 窗口,如下图:
②进入阿里云的云命令窗口,先链接 MySQL 的示例,需要进行清屏后输入 id,打开一个窗口后需打开第二个窗口,为了实验方便,这里只开两个窗口;接下来访问示例,复制内网地址再回车,另一个窗口的操作一样,输入“-h”后加上内网地址再回车;同样采取之前的实验数据,使用阿里云,user 表和 user-back 表,如下图:
③两个表的结构和内容是一样的,不一样的地方在 show create table user,如下图:
两个表中“ENGINE=In no DB”都是基于 In no DB 的存储引擎。
(4)在 In no DB 存储引擎和 MySQL 存储引擎下的表现形式是怎样的?
①为了演示方便,表中的内容不适合 MySQL 的存储引擎,所以退出后使用本地示例,接下来的操作也是如此,可以看到 MySQL 的 show tables 表如下:
②以下是 MySQL 的 user 表和 user-back 表图示:
这是两个不同的存储引擎,在此是为了演示,所以用的不同的存储引擎。
(5)接下来测试 user-back(为了观察在做显示时,有什么影响)
①输入 from user-back,详情如下:
这是 MySQL 的存储引擎,接下来输入 being,再修改某一条数据,把表中的zhangsan2 改成 zhangsan, 可查询到以下结果:
②可以看到名字改成功了,再来回滚一下,看是否能回到 zhangsan2,结果告诉并不会再回到 zhangsan2,这样更
行无操作,大家还能继续查询,如图:
注意,这时不能继续查询 user 表,会出提示;如果后面要查询的表没有在前面的表中进行锁定,便会报错,所以需要在前面表的基础之下进行操作;
②接下来进行修改,输入“update user-bak set name=‘zhangsan2’where id=1”,在另一边同样去执行,先执行一次查询。输入“select *from user-bak”,之后会直接进行阻塞,因为整个表已经被属定,其中一个表执行的 look,这边去执行还是不行;要是去查 ID=2 的,同样不行。需要注意的是第一个表执行了 look 和write,第二个表是不能进行查询和改写的。这是大家的机制。要想执行成功,需unlock tables 查询成功后方可执行,这是对于锁写操作。
③对锁读的操作,输入“look tables user-bak read”,在另一个表中是可以进行查询的,进行锁读操作后,另一边可以对用户端进行查询,但是不能进行改写。






