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 08 MySQL
mysql查询的控制语句图文详解
Apr 11 MySQL
MySQL查看表和清空表的常用命令总结
May 26 MySQL
MySql存储过程之逻辑判断和条件控制
May 26 MySQL
Mysql数据库值的添加、修改、删除及清空操作实例
Jun 20 MySQL
MySQL定时备份数据库(全库备份)的实现
Sep 25 MySQL
mysql中数据库覆盖导入的几种方式总结
Mar 25 MySQL
一文简单了解MySQL前缀索引
Apr 03 MySQL
排查MySQL生产环境索引没有效果
Apr 11 MySQL
MySQL视图概念以及相关应用
Apr 19 MySQL
mysql 8.0.27 绿色解压版安装教程及配置方法
Apr 20 MySQL
MySQL中的全表扫描和索引树扫描
May 15 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
PHP4之COOKIE支持详解
2006/10/09 PHP
php导入导出excel实例
2013/10/25 PHP
PHP实现的简单日历类
2014/11/29 PHP
Yii2基于Ajax自动获取表单数据的方法
2016/08/10 PHP
详解PHP变量传值赋值和引用赋值变量销毁
2019/03/23 PHP
Yii框架学习笔记之session与cookie简单操作示例
2019/04/30 PHP
xtree.js 代码
2007/03/13 Javascript
解决使用attachEvent函数时,this指向被绑定的元素的问题的方法
2007/08/13 Javascript
javascript 当前日期转化为中文的实现代码
2010/05/13 Javascript
jQuery fadeTo方法调整图片的透明度使用介绍
2013/05/06 Javascript
探讨在JQuery和Js中,如何让ajax执行完后再继续往下执行
2013/07/09 Javascript
JavaScript必看小技巧(必看)
2016/06/07 Javascript
Web打印解决方案之证件套打的实现思路
2016/08/29 Javascript
浅谈jquery中使用canvas的问题
2016/10/10 Javascript
JavaScript验证知识整理
2017/03/24 Javascript
微信小程序 蓝牙的实现实例代码
2017/06/27 Javascript
React Native中Mobx的使用方法详解
2018/12/04 Javascript
Element输入框带历史查询记录的实现示例
2019/01/15 Javascript
微信小程序简单的canvas裁剪图片功能详解
2019/07/12 Javascript
详解使用JWT实现单点登录(完全跨域方案)
2019/08/02 Javascript
过滤器vue.filters的使用方法实现
2019/09/18 Javascript
js实现购物车商品数量加减
2020/09/21 Javascript
Python 字符串操作方法大全
2014/03/11 Python
python实现解数独程序代码
2017/04/12 Python
python集合比较(交集,并集,差集)方法详解
2018/09/13 Python
python TKinter获取文本框内容的方法
2018/10/11 Python
python 爬取免费简历模板网站的示例
2020/09/27 Python
马来西亚在线时尚女装商店:KEI MAG
2017/09/28 全球购物
中国专业的音频分享平台:喜马拉雅
2019/05/24 全球购物
幼儿园保育员辞职信
2014/01/12 职场文书
初一学生期末评语
2014/04/24 职场文书
小学生安全保证书
2015/05/09 职场文书
七年级作文之下雨天
2019/12/23 职场文书
golang 定时任务方面time.Sleep和time.Tick的优劣对比分析
2021/05/05 Golang
golang中的并发和并行
2021/05/08 Golang
从QQtabBar看css命名规范BEM的详细介绍
2021/08/07 HTML / CSS