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 06 MySQL
你知道哪几种MYSQL的连接查询
Jun 03 MySQL
MySQL 十大常用字符串函数详解
Jun 30 MySQL
MySQL非空约束(not null)案例讲解
Aug 23 MySQL
MySQL基础快速入门知识总结(附思维导图)
Sep 25 MySQL
面试被问select......for update会锁表还是锁行
Nov 11 MySQL
彻底解决MySQL使用中文乱码的方法
Jan 22 MySQL
Mysql外键约束的创建与删除的使用
Mar 03 MySQL
关于MySQL临时表为什么可以重名的问题
Mar 22 MySQL
MySQL批量更新不同表中的数据
May 11 MySQL
关于MySQL中explain工具的使用
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中的类-什么叫类
2006/11/20 PHP
ThinkPHP实现附件上传功能
2017/04/27 PHP
PHP实现权限管理功能示例
2017/09/22 PHP
PHP getNamespaces()函数讲解
2019/02/03 PHP
JavaScript页面刷新与弹出窗口问题的解决方法
2010/03/02 Javascript
Whatever:hover 无需javascript让IE支持丰富伪类
2010/06/29 Javascript
Javascript中正则表达式的全局匹配模式分析
2011/04/26 Javascript
JavaScript 图像动画的小demo
2012/05/23 Javascript
json的定义、标准格式及json字符串检验
2014/05/11 Javascript
javascript正则表达式之search()用法实例
2015/01/19 Javascript
深入理解JavaScript系列(41):设计模式之模板方法详解
2015/03/04 Javascript
jquery实现文本框textarea自适应高度
2016/03/09 Javascript
jQuery插件扩展实例【添加回调函数】
2016/11/26 Javascript
JavaScript中 this 指向问题深度解析
2017/02/21 Javascript
react-router JS 控制路由跳转实例
2017/06/15 Javascript
element-ui 的el-button组件中添加自定义颜色和图标的实现方法
2018/10/26 Javascript
JS散列表碰撞处理、开链法、HashTable散列示例
2019/02/08 Javascript
使用 Jest 和 Supertest 进行接口端点测试实例详解
2020/04/25 Javascript
原生js实现俄罗斯方块
2020/10/20 Javascript
vue 获取url参数、get参数返回数组的操作
2020/11/12 Javascript
Python单元测试框架unittest简明使用实例
2015/04/13 Python
python中通过预先编译正则表达式提高效率
2017/09/25 Python
Python冲顶大会 快来答题!
2018/01/17 Python
使用requests库制作Python爬虫
2018/03/25 Python
Django 登陆验证码和中间件的实现
2018/08/17 Python
对Python subprocess.Popen子进程管道阻塞详解
2018/10/29 Python
Python绘图Matplotlib之坐标轴及刻度总结
2019/06/28 Python
通过python3实现投票功能代码实例
2019/09/26 Python
jupyter notebook 增加kernel教程
2020/04/10 Python
纯HTML5+CSS3制作图片旋转
2016/01/12 HTML / CSS
大学计划书范文800字
2014/08/14 职场文书
2019最新版火锅店的创业计划书 !
2019/07/12 职场文书
有关保护环境的宣传标语100条
2019/08/07 职场文书
详解NodeJS模块化
2021/06/15 NodeJs
K8s部署发布Golang应用程序的实现方法
2021/07/16 Golang
MySQL视图概念以及相关应用
2022/04/19 MySQL