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 相关文章推荐
Windows10下安装MySQL8
Apr 06 MySQL
Idea连接MySQL数据库出现中文乱码的问题
Apr 14 MySQL
Mysql基础之常见函数
Apr 22 MySQL
MySQL完整性约束的定义与实例教程
May 30 MySQL
浅谈MySQL之浅入深出页原理
Jun 23 MySQL
MySQL外键约束(FOREIGN KEY)案例讲解
Aug 23 MySQL
MySQL高级进阶sql语句总结大全
Mar 16 MySQL
MySQL学习之基础操作总结
Mar 19 MySQL
MySQL脏读,幻读和不可重复读
May 11 MySQL
MySQL中EXPLAIN语句及用法
May 20 MySQL
MYSQL中文乱码问题的解决方案
Jun 14 MySQL
MySQL存储过程及语法详解
Aug 05 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读取图片内容并输出到浏览器的实现代码
2013/08/08 PHP
php 下载保存文件保存到本地的两种实现方法
2013/08/12 PHP
Yii框架模拟组件调用注入示例
2019/11/11 PHP
JavaScript获取GridView中用户点击控件的行号,列号
2009/04/14 Javascript
javascript 解析url的search方法
2010/02/09 Javascript
boxy基于jquery的弹出层对话框插件扩展应用 弹出层选择器
2010/11/21 Javascript
jquery下将选择的checkbox的id组成字符串的方法
2010/11/28 Javascript
关于jquery append() html时的小问题的解决方法
2010/12/16 Javascript
jquery应该如何来设置改变按钮input的onclick事件
2012/12/10 Javascript
JavaScript中的Math 使用介绍
2014/04/21 Javascript
js表格排序实例分析(支持int,float,date,string四种数据类型)
2015/05/06 Javascript
jquery获取css的color值返回RGB的方法
2015/12/18 Javascript
Vue.js基础知识小结
2017/01/13 Javascript
80%应聘者都不及格的JS面试题
2017/03/21 Javascript
js匿名函数使用&传参(实例)
2017/09/08 Javascript
Vue 页面切换效果之 BubbleTransition(推荐)
2018/04/08 Javascript
详解vue-router数据加载与缓存使用总结
2018/10/29 Javascript
微信小程序wxs实现吸顶效果
2020/01/08 Javascript
jquery向后台提交数组的代码分析
2020/02/20 jQuery
详细分析Node.js 模块系统
2020/06/28 Javascript
Vue实现穿梭框效果
2020/09/30 Javascript
[38:23]完美世界DOTA2联赛循环赛 FTD vs PXG BO2第二场 11.01
2020/11/02 DOTA
对web.py设置favicon.ico的方法详解
2018/12/04 Python
python多线程同步之文件读写控制
2021/02/25 Python
python3 pillow模块实现简单验证码
2019/10/31 Python
PyQt5实现仿QQ贴边隐藏功能的实例代码
2020/05/24 Python
Python3爬虫带上cookie的实例代码
2020/07/28 Python
关于Java finally的面试题
2016/04/27 面试题
英文版餐饮运营管理求职信
2013/11/06 职场文书
八年级音乐教学反思
2014/01/09 职场文书
2014年乡镇团委工作总结
2014/12/18 职场文书
维稳工作承诺书
2015/01/20 职场文书
茶楼服务员岗位职责
2015/02/09 职场文书
2015年电话销售工作总结范文
2015/04/20 职场文书
如何写好闭幕词
2019/04/02 职场文书
在pycharm中无法import所安装的库解决方案
2021/05/31 Python