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 相关文章推荐
如何使用Maxwell实时同步mysql数据
Apr 08 MySQL
MySQL系列之开篇 MySQL关系型数据库基础概念
Jul 02 MySQL
MySQL非空约束(not null)案例讲解
Aug 23 MySQL
MySQL中order by的使用详情
Nov 17 MySQL
MySQL中int (10) 和 int (11) 的区别
Jan 22 MySQL
Mysql忘记密码解决方法
Feb 12 MySQL
Mysql分库分表之后主键处理的几种方法
Feb 15 MySQL
Mysql Innodb存储引擎之索引与算法
Feb 15 MySQL
一文了解MySQL二级索引的查询过程
Feb 24 MySQL
MySQL Server 层四个日志
Mar 31 MySQL
MySQL查询日期时间
May 15 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
360通用php防护代码(使用操作详解)
2013/06/18 PHP
extJs 文本框后面加上说明文字+下拉列表选中值后触发事件
2009/11/27 Javascript
JQuery对id中含有特殊字符的转义处理示例
2013/09/06 Javascript
JS格式化数字金额用逗号隔开保留两位小数
2013/10/18 Javascript
js 时间格式与时间戳的相互转换示例代码
2013/12/25 Javascript
JQuery 使用attr方法实现下拉列表选中
2014/10/13 Javascript
angular.foreach 循环方法使用指南
2015/01/06 Javascript
JavaScript更改原始对象valueOf的方法
2015/03/19 Javascript
jquery彩色投票进度条简单实例演示
2020/07/23 Javascript
理解javascript异步编程
2016/01/27 Javascript
JavaScript禁止用户多次提交的两种方法
2016/07/24 Javascript
全面解析Bootstrap表单样式的使用
2016/09/09 Javascript
Javascript中document.referrer隐藏来源的方法
2017/01/16 Javascript
js 转义字符及URI编码详解
2017/02/28 Javascript
基于Vue实现后台系统权限控制的示例代码
2017/08/29 Javascript
实例分析JS与Node.js中的事件循环
2017/12/12 Javascript
[01:00:30]完美世界DOTA2联赛循环赛 Inki vs Matador BO2第二场 10.31
2020/11/02 DOTA
python使用os模块的os.walk遍历文件夹示例
2014/01/27 Python
Python中exit、return、sys.exit()等使用实例和区别
2015/05/28 Python
python下MySQLdb用法实例分析
2015/06/08 Python
python利用Opencv实现人脸识别功能
2019/04/25 Python
Django学习笔记之为Model添加Action
2019/04/30 Python
python获取Pandas列名的几种方法
2019/08/07 Python
python如何基于redis实现ip代理池
2020/01/17 Python
python如何把字符串类型list转换成list
2020/02/18 Python
python实现UDP协议下的文件传输
2020/03/20 Python
Pytorch实验常用代码段汇总
2020/11/19 Python
html5小技巧之通过document.head获取head元素
2014/06/04 HTML / CSS
什么造成了Java里面的异常
2016/04/24 面试题
公司年会抽奖活动主持词
2014/03/31 职场文书
竞选班干部演讲稿500字
2014/08/20 职场文书
民主评议党员个人总结
2015/02/13 职场文书
质检员岗位职责范本
2015/04/07 职场文书
原来闭幕词是这样写的呀!
2019/07/01 职场文书
MySQL系列之开篇 MySQL关系型数据库基础概念
2021/07/02 MySQL
Django框架中表单的用法
2022/06/10 Python