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 18 MySQL
Mysql数据库按时间点恢复实战记录
Jun 30 MySQL
MySQL索引是啥?不懂就问
Jul 21 MySQL
MySQL中utf8mb4排序规则示例
Aug 02 MySQL
MySQL去除重叠时间求时间差和的实现
Aug 23 MySQL
MySQL中的引号和反引号的区别与用法详解
Oct 24 MySQL
MySQL数据库安装方法与图形化管理工具介绍
May 30 MySQL
MySQL普通表如何转换成分区表
May 30 MySQL
MySQL解决Navicat设置默认字符串时的报错问题
Jun 16 MySQL
MySQL主从切换的超详细步骤
Jun 28 MySQL
MySQL事务的隔离级别详情
Jul 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
用PHP连接Oracle数据库
2006/10/09 PHP
PHPStorm 2020.1 调试 Nodejs的多种方法详解
2020/09/17 NodeJs
PhpSpreadsheet设置单元格常用操作汇总
2020/11/13 PHP
js的一些常用方法小结
2011/06/29 Javascript
js获取当前页面的url网址信息
2014/06/12 Javascript
Vue实例简单方法介绍
2017/01/20 Javascript
微信小程序 开发之顶部导航栏实例代码
2017/02/23 Javascript
详解vue-router 2.0 常用基础知识点之导航钩子
2017/05/10 Javascript
深入解析nodejs HTTP服务
2017/07/25 NodeJs
angularJs提交文本框数据到后台的方法
2018/10/08 Javascript
灵活使用console让js调试更简单的方法步骤
2019/04/23 Javascript
Element中Slider滑块的具体使用
2020/07/29 Javascript
用vue写一个日历
2020/11/02 Javascript
vant组件中 dialog的确认按钮的回调事件操作
2020/11/04 Javascript
python 测试实现方法
2008/12/24 Python
Python文件和流(实例讲解)
2017/09/12 Python
Python数据分析之双色球统计两个红和蓝球哪组合比例高的方法
2018/02/03 Python
Python之list对应元素求和的方法
2018/06/28 Python
Pycharm 文件更改目录后,执行路径未更新的解决方法
2019/07/19 Python
Django框架自定义模型管理器与元选项用法分析
2019/07/22 Python
django表单的Widgets使用详解
2019/07/22 Python
python实现的登录与提交表单数据功能示例
2019/09/25 Python
pytorch masked_fill报错的解决
2020/02/18 Python
pytorch torchvision.ImageFolder的用法介绍
2020/02/20 Python
python批量提取图片信息并保存的实现
2021/02/05 Python
德国领先的大尺码和超大尺码男装在线零售商:Bigtex
2019/06/22 全球购物
Java面试题:请问一下代码输出是什么
2015/05/27 面试题
财务管理专业应届毕业生求职信
2013/09/22 职场文书
幼儿园六一活动总结
2014/08/27 职场文书
政法干警核心价值观心得体会
2014/09/11 职场文书
家庭贫困证明
2014/09/23 职场文书
2014年销售经理工作总结
2014/12/01 职场文书
观看《筑梦中国》纪录片心得体会
2016/01/18 职场文书
高中议论文(范文2篇)
2019/08/19 职场文书
MySQL之DML语言
2021/04/05 MySQL
python实现的web监控系统
2021/04/27 Python