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 相关文章推荐
浅析InnoDB索引结构
Apr 05 MySQL
浅析MySQL如何实现事务隔离
Jun 26 MySQL
MySQL窗口函数的具体使用
Nov 17 MySQL
深入讲解数据库中Decimal类型的使用以及实现方法
Feb 15 MySQL
MYSQL如何查看进程和kill进程
Mar 13 MySQL
数据分析数据库ClickHouse在大数据领域应用实践
Apr 03 MySQL
mysql查询结果实现多列拼接查询
Apr 03 MySQL
MySQL 数据库范式化设计理论
Apr 22 MySQL
详解Mysql事务并发(脏读、不可重复读、幻读)
Apr 29 MySQL
MySQL数据库如何查看表占用空间大小
Jun 10 MySQL
SQL语句中EXISTS的详细用法大全
Jun 25 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连接局域网MYSQL数据库的简单实例
2013/08/26 PHP
php向js函数传参的几种方法
2014/08/10 PHP
Laravel框架学习笔记之批量更新数据功能
2019/05/30 PHP
用js实现的仿sohu博客更换页面风格(简单版)
2007/03/22 Javascript
Javascript attachEvent传递参数的办法
2009/12/14 Javascript
简单实用jquery版三级联动select示例
2013/07/04 Javascript
jQuery Form 页面表单提交的小例子
2013/11/15 Javascript
优化javascript的执行效率一些方法总结
2013/12/25 Javascript
JS实现漂亮的淡蓝色滑动门效果代码
2015/09/23 Javascript
基于Bootstrap+jQuery.validate实现表单验证
2016/05/30 Javascript
jQuery 检查某个元素在页面上是否存在实例代码
2016/10/27 Javascript
Angular-Touch库用法示例
2016/12/22 Javascript
详解用node-images 打造简易图片服务器
2017/05/08 Javascript
bootstrap paginator分页前后台用法示例
2017/06/17 Javascript
手把手教你把nodejs部署到linux上跑出hello world
2017/06/19 NodeJs
Javascript实现base64的加密解密方法示例
2017/06/27 Javascript
jQuery中extend函数简单用法示例
2017/10/11 jQuery
IntelliJ IDEA 安装vue开发插件的方法
2017/11/21 Javascript
Vue组件通信的几种实现方法
2019/04/25 Javascript
vue基于v-charts封装双向条形图的实现代码
2019/12/09 Javascript
对于Python编程中一些重用与缩减的建议
2015/04/14 Python
Python中使用装饰器来优化尾递归的示例
2016/06/18 Python
wx.CheckBox创建复选框控件并响应鼠标点击事件
2018/04/25 Python
django 实现电子支付功能的示例代码
2018/07/25 Python
在python中bool函数的取值方法
2018/11/01 Python
python使用Paramiko模块实现远程文件拷贝
2019/04/30 Python
Python如何计算语句执行时间
2019/11/22 Python
Python enumerate() 函数如何实现索引功能
2020/06/29 Python
用python计算文件的MD5值
2020/12/23 Python
HTML5实现预览本地图片
2016/02/17 HTML / CSS
学术会议欢迎词
2014/01/09 职场文书
财务情况说明书范文
2014/05/06 职场文书
公务员学习习总书记“三严三实”思想汇报
2014/09/19 职场文书
买卖合同协议书范本
2014/10/18 职场文书
银行资信证明
2015/06/17 职场文书
2016年社区服务活动总结
2016/04/06 职场文书