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 自定义变量的概念及特点
May 13 MySQL
MYSQL主从数据库同步备份配置的方法
May 26 MySQL
ORM模型框架操作mysql数据库的方法
Jul 25 MySQL
为什么MySQL 删除表数据 磁盘空间还一直被占用
Oct 16 MySQL
MySQL和Oracle批量插入SQL的通用写法示例
Nov 17 MySQL
VS2019连接MySQL数据库的过程及常见问题总结
Nov 27 MySQL
解析MySQL索引的作用
Mar 03 MySQL
MySQL多表查询机制
Mar 17 MySQL
如何创建一个创建MySQL数据库中的datetime类型
Mar 21 MySQL
mysql数据插入覆盖和时间戳的问题及解决
Mar 25 MySQL
详细介绍MySQL中limit和offset的用法
May 06 MySQL
mysql sql常用语句大全
Jun 21 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学习散记_编码(json_encode 中文不显示)
2011/11/10 PHP
PHP导航下拉菜单的实现如此简单
2013/09/22 PHP
PHP函数引用返回的实例详解
2016/09/11 PHP
PHP读取文件,解决中文乱码UTF-8的方法分析
2020/01/22 PHP
jQuery在iframe中无法弹出对话框的解决方法
2014/01/12 Javascript
JavaScript常用小技巧小结
2014/12/29 Javascript
JS拖动鼠标画出方框实现鼠标选区的方法
2015/08/05 Javascript
基于jquery实现人物头像跟随鼠标转动
2015/08/23 Javascript
Nodejs实战心得之eventproxy模块控制并发
2015/10/27 NodeJs
JavaScript每天必学之基础知识
2016/09/17 Javascript
15个非常实用的JavaScript代码片段
2016/12/18 Javascript
微信小程序 Template详解及简单实例
2017/01/05 Javascript
JavaScript实现按键精灵的原理分析
2017/02/21 Javascript
js脚本编写简单刷票投票系统
2017/06/27 Javascript
jquery实现侧边栏左右伸缩效果的示例
2017/12/19 jQuery
vue 做移动端微信公众号采坑经验记录
2018/04/26 Javascript
详解微信小程序之一键复制到剪切板
2019/04/24 Javascript
vue history 模式打包部署在域名的二级目录的配置指南
2019/07/02 Javascript
详解Python3.1版本带来的核心变化
2015/04/07 Python
Python用模块pytz来转换时区
2016/08/19 Python
Python实现正则表达式匹配任意的邮箱方法
2018/12/20 Python
python实现Excel文件转换为TXT文件
2019/04/28 Python
tensorflow入门:TFRecordDataset变长数据的batch读取详解
2020/01/20 Python
Python实现常见的几种加密算法(MD5,SHA-1,HMAC,DES/AES,RSA和ECC)
2020/05/09 Python
Python的控制结构之For、While、If循环问题
2020/06/30 Python
基于python tkinter的点名小程序功能的实例代码
2020/08/22 Python
python实现图书馆抢座(自动预约)功能的示例代码
2020/09/29 Python
让IE6、IE7、IE8支持CSS3的脚本
2010/07/20 HTML / CSS
JACK & JONES瑞典官方网站:杰克琼斯欧式风格男装
2017/12/23 全球购物
SQL Server提供的3种恢复模型都是什么? 有什么区别?
2012/05/13 面试题
大学生军训自我鉴定
2014/02/12 职场文书
运动会广播稿20字
2014/02/18 职场文书
司法工作人员群众路线对照检查材料思想汇报
2014/09/30 职场文书
2016年大学生实习单位评语
2015/12/01 职场文书
Python爬虫入门案例之回车桌面壁纸网美女图片采集
2021/10/16 Python
Java 数据结构七大排序使用分析
2022/04/02 Java/Android