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 05 MySQL
数据库连接池
Apr 06 MySQL
MySQL sql_mode的使用详解
May 08 MySQL
超详细教你怎么升级Mysql的版本
May 19 MySQL
MySQL完整性约束的定义与实例教程
May 30 MySQL
MySQL8.0无法启动3534的解决方法
Jun 03 MySQL
MySQL Shell import_table数据导入的实现
Aug 07 MySQL
MySQL数据库完全卸载的方法
Mar 03 MySQL
MySQL 分区表中分区键为什么必须是主键的一部分
Mar 17 MySQL
解决Mysql中的innoDB幻读问题
Apr 29 MySQL
MySQL外键约束(Foreign Key)案例详解
Jun 28 MySQL
SQL Server数据库的三种创建方法汇总
May 08 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 使用array函数实现分页
2015/02/13 PHP
PHP从FLV文件获取视频预览图的方法
2015/03/12 PHP
JS对URL字符串进行编码/解码分析
2008/10/25 Javascript
基于jquery的滚动鼠标放大缩小图片效果
2011/10/27 Javascript
jQuery中prepend()方法用法实例
2014/12/25 Javascript
基于jquery实现表格内容筛选功能实例解析
2016/05/09 Javascript
JavaScript数组的栈方法与队列方法详解
2016/05/26 Javascript
基于jQuery实现淡入淡出效果轮播图
2020/07/31 Javascript
vue日期组件 支持vue1.0和2.0
2017/01/09 Javascript
浅谈JavaScript中promise的使用
2017/01/11 Javascript
vue 注册组件的使用详解
2018/05/05 Javascript
vue-router重定向和路由别名的使用讲解
2019/01/19 Javascript
jquery实现动态改变css样式的方法分析
2019/05/27 jQuery
一张图带我们入门Python基础教程
2017/02/05 Python
Django Rest framework之认证的实现代码
2018/12/17 Python
基于树莓派的语音对话机器人
2019/06/17 Python
Flask框架单例模式实现方法详解
2019/07/31 Python
opencv resize图片为正方形尺寸的实现方法
2019/12/26 Python
python字符串下标与切片及使用方法
2020/02/13 Python
pyinstaller打包找不到文件的问题解决
2020/04/15 Python
python suds访问webservice服务实现
2020/06/26 Python
Python 中Operator模块的使用
2021/01/30 Python
CSS3中动画属性transform、transition和animation属性的区别
2016/09/25 HTML / CSS
使用CSS3代码绘制可爱的Hello Kitty猫
2016/08/03 HTML / CSS
HTML5实现的图片无限加载的瀑布流效果另带边框圆角阴影
2014/03/07 HTML / CSS
三星法国官方网站:Samsung法国
2019/10/31 全球购物
查环查孕证明
2014/01/10 职场文书
生日主持词
2014/03/20 职场文书
校庆标语集锦
2014/06/25 职场文书
新学期开学标语
2014/06/30 职场文书
租车协议书范本2014
2014/11/17 职场文书
五年级小学生评语
2014/12/26 职场文书
2015年乡镇人大工作总结
2015/04/22 职场文书
2016习总书记系列重要讲话心得体会
2016/01/15 职场文书
忠诚教育学习心得体会
2016/01/23 职场文书
检讨书之工作不认真
2019/08/14 职场文书