MySQL 原理与优化之原数据锁的应用


Posted in MySQL onAugust 14, 2022

MySQL 原理与优化之原数据锁的应用

MySQL 中原数据锁是系统自动控制添加的,对于用户来说无需显示调用,当我们使用一张表的时候就会加上原数据锁。

原数据锁的作用是为了保护表原数据的一致性,如果在表上有活动事务的时候,不可以对元数据进行写入操作。也就是为了避免DML 和DDL 之间的冲突,保证读写的正确性。

说白了就是,在对数据表进行读写操作的时候,不能进行修改表结构的操作

MySQL 原理与优化之原数据锁的应用

如上图所示,在执行select 操作的时候,MySQL 会自动加上shared_read 锁,在insert,update, delete 以及 select for update 操作的时候会加上shared_write 锁,这两类锁是兼容的。

在执行alter table 操作的时候,会加上 exclusive 锁,这个锁与shared_read 和 shared_write 锁 是互斥的,换句话说在做查询和更新表数据的时候,是不能够修改表结构的。

来看个例子:

首先开启事务,使用select 语句会针对表加上shared_read的共享锁

begin;
select * from course;

此时查看原数据锁的信息:

select object_type,object_schema,object_name,lock_type,lock_duration from performance_schema.metadata_locks;

MySQL 原理与优化之原数据锁的应用

通过上图我们可以发现,course 表加上了shared_read锁。

接着,开启另外一个事务,记住刚才的事务不要commit

begin;
update course set name = 'Jason' where id =2;

MySQL 原理与优化之原数据锁的应用

如上图所示,此时的update 语句可以执行成功,并没有被阻塞。说明select 和update 是不冲突的,他们的锁是兼容的。

再次查看原数据锁

select object_type,object_schema,object_name,lock_type,lock_duration from performance_schema.metadata_locks;

MySQL 原理与优化之原数据锁的应用

从上面的截图可以看出,此时原数据锁的表中记录了两条记录分别是针对course 表的shared_read 和 shared_write 锁,也刚好对应我们执行的select 和update 操作。

最后,我们再启动第三个客户端,并且启动 第三个事务,执行alter语句,在course 表中加入一个字段hello 如下 。

begin;
alter table course add column hello int;

MySQL 原理与优化之原数据锁的应用

由于之前的事务没有提交所以修改表的操作会被阻塞,因为shared_read 以及 shared_write 这两个锁 与 exclusive之间是互斥的,所以会阻塞

此时,回到最开始的两个客户端,对两个事务进行commit 操作,再返回到第三个事务执行的alter 语句出,发现语句顺利执行。

MySQL 原理与优化之原数据锁的应用

到此这篇关于MySQL 原理与优化之原数据锁的应用的文章就介绍到这了,更多相关MySQL原数据锁应用内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
MySQL数据迁移相关总结
Apr 29 MySQL
MySQL5.7并行复制原理及实现
Jun 03 MySQL
mysql 带多个条件的查询方式
Jun 05 MySQL
浅谈MySQL next-key lock 加锁范围
Jun 07 MySQL
SQL实战演练之网上商城数据库商品类别数据操作
Oct 24 MySQL
面试被问select......for update会锁表还是锁行
Nov 11 MySQL
MySQL和Oracle批量插入SQL的通用写法示例
Nov 17 MySQL
你真的会用Mysql的explain吗
Mar 31 MySQL
mysql使用FIND_IN_SET和group_concat两个方法查询上下级机构
Apr 20 MySQL
MySQL 原理与优化之Limit 查询优化
Aug 14 MySQL
MySQL使用IF语句及用case语句对条件并结果进行判断 
Sep 23 MySQL
mysql通过group by分组取最大时间对应数据的两种有效方法
Sep 23 MySQL
MySql按时,天,周,月进行数据统计
Aug 14 #MySQL
MySQL中LAG()函数和LEAD()函数的使用
Aug 14 #MySQL
前端传参数进行Mybatis调用mysql存储过程执行返回值详解
Aug 14 #MySQL
MySQL数据库查询之多表查询总结
Aug 05 #MySQL
分享很少见很有用的SQL功能CORRESPONDING
Aug 05 #MySQL
MySQL存储过程及语法详解
Aug 05 #MySQL
MySQL自定义函数及触发器
Aug 05 #MySQL
You might like
对PHP新手的一些建议(PHP学习经验总结)
2014/08/20 PHP
windows7配置Nginx+php+mysql的详细教程
2016/09/04 PHP
thinkPHP5.0框架环境变量配置方法
2017/03/17 PHP
tp5.0框架隐藏index.php入口文件及模块和控制器的方法分析
2020/02/11 PHP
Javascript string 扩展库代码
2010/04/09 Javascript
PHP abstract与interface之间的区别
2013/11/11 Javascript
JS关键字球状旋转效果的实例代码
2013/11/29 Javascript
JavaScript中的索引数组、关联数组和静态数组、动态数组讲解
2014/11/08 Javascript
angularjs学习笔记之三大模块(modal,controller,view)
2015/09/26 Javascript
微信小程序 开发工具快捷键整理
2016/10/31 Javascript
原生js实现验证码功能
2017/03/16 Javascript
JavaScript模拟实现封装的三种方式及写法区别
2017/10/27 Javascript
vue表单自定义校验规则介绍
2018/08/28 Javascript
微信小程序实现左滑修改、删除功能
2020/10/19 Javascript
python排序方法实例分析
2015/04/30 Python
Python简单网络编程示例【客户端与服务端】
2017/05/26 Python
使用pandas对两个dataframe进行join的实例
2018/06/08 Python
python3 实现一行输入,空格隔开的示例
2018/11/14 Python
Python实现钉钉发送报警消息的方法
2019/02/20 Python
利用Pytorch实现简单的线性回归算法
2020/01/15 Python
Windows上安装tensorflow  详细教程(图文详解)
2020/02/04 Python
python GUI库图形界面开发之PyQt5窗口类QMainWindow详细使用方法
2020/02/26 Python
Python通过文本和图片生成词云图
2020/05/21 Python
Django serializer优化类视图的实现示例
2020/07/16 Python
美国在线眼镜店:GlassesShop
2018/11/15 全球购物
Jowissa官方网站:瑞士制造的手表,优雅简约的设计
2020/07/29 全球购物
教师敬业奉献模范事迹材料
2014/05/18 职场文书
考试作弊检讨书怎么写?
2014/12/21 职场文书
淘宝文案策划岗位职责
2015/04/14 职场文书
房租涨价通知
2015/04/23 职场文书
2016入党积极分子党课培训心得体会
2016/01/06 职场文书
用人单位的规章制度,怎样制定才是有效的?
2019/07/09 职场文书
人生一定要学会的三样东西:放下、忘记、珍惜
2019/08/21 职场文书
浅谈Python 中的复数问题
2021/05/19 Python
maven依赖的version声明控制方式
2022/01/18 Java/Android
MySQL 数据 data 基本操作
2022/05/04 MySQL