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 07 MySQL
详解MySQL InnoDB存储引擎的内存管理
Apr 08 MySQL
MySql子查询IN的执行和优化的实现
Aug 02 MySQL
SQL实现LeetCode(180.连续的数字)
Aug 04 MySQL
记一次Mysql不走日期字段索引的原因小结
Oct 24 MySQL
一篇文章看懂MySQL主从复制与读写分离
Nov 07 MySQL
SQL基础的查询语句
Nov 11 MySQL
MySQL七大JOIN的具体使用
Feb 28 MySQL
优化Mysql查询的示例
Apr 26 MySQL
mysql5.5中文乱码问题解决的有用方法
May 30 MySQL
MySQL数据库之内置函数和自定义函数 function
Jun 16 MySQL
MySQL 原理与优化之Limit 查询优化
Aug 14 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 时间计算问题小结
2009/01/04 PHP
php中将网址转换为超链接的函数
2011/09/02 PHP
ThinkPHP实例化模型的四种方法概述
2014/08/22 PHP
laravel 5异常错误:FatalErrorException in Handler.php line 38的解决
2017/10/12 PHP
什么是PHP7中的孤儿进程与僵尸进程
2019/04/14 PHP
邮箱下拉自动填充选择示例代码附图
2014/04/03 Javascript
防止登录页面出现在frame中js代码
2014/07/22 Javascript
js中的getAttribute方法使用示例
2014/08/01 Javascript
jQuery中:eq()选择器用法实例
2014/12/29 Javascript
仿JQuery输写高效JSLite代码的一些技巧
2015/01/13 Javascript
PHP+jQuery+Ajax实现多图片上传效果
2015/03/14 Javascript
JavaScript中字符串(string)转json的2种方法
2015/06/25 Javascript
基于jQuery实现的菜单切换效果
2015/10/16 Javascript
jQuery实现元素拖拽并cookie保存顺序的方法
2016/02/20 Javascript
AngularJS入门教程之控制器详解
2016/07/27 Javascript
Vue项目分环境打包的实现步骤
2018/04/02 Javascript
JavaScript闭包原理与用法实例分析
2018/08/10 Javascript
微信小程序http连接访问解决方案的示例
2018/11/05 Javascript
ES6基础之 Promise 对象用法实例详解
2019/08/22 Javascript
在Uni中使用Vue的EventBus总线机制操作
2020/07/31 Javascript
python实现ping的方法
2015/07/06 Python
Python 实现引用其他.py文件中的类和类的方法
2018/04/29 Python
python tornado微信开发入门代码
2018/08/24 Python
python实现三维拟合的方法
2018/12/29 Python
python+rsync精确同步指定格式文件
2019/08/29 Python
Python+Kepler.gl实现时间轮播地图过程解析
2020/07/20 Python
HTML5的革新 结构之美
2011/06/20 HTML / CSS
使用html5实现表格实现标题合并的实例代码
2019/05/13 HTML / CSS
微软美国官方网站:Microsoft美国
2018/05/10 全球购物
卖房协议书样本
2014/10/30 职场文书
2014年食品安全工作总结
2014/12/04 职场文书
汽车4S店销售经理岗位职责
2015/04/02 职场文书
导游词之阳朔遇龙河
2019/12/16 职场文书
用Python将库打包发布到pypi
2021/04/13 Python
Python3接口性能测试实例代码
2021/06/20 Python
15个值得收藏的JavaScript函数
2021/09/15 Javascript