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 Router的安装部署
Apr 24 MySQL
超详细教你怎么升级Mysql的版本
May 19 MySQL
IDEA 链接Mysql数据库并执行查询操作的完整代码
May 20 MySQL
正确使用MySQL INSERT INTO语句
May 26 MySQL
MySQL系列之四 SQL语法
Jul 02 MySQL
SQL实现LeetCode(178.分数排行)
Aug 04 MySQL
MySQL之select、distinct、limit的使用
Nov 11 MySQL
浅谈MySql整型索引和字符串索引失效或隐式转换问题
Nov 20 MySQL
MySQL优化常用的19种有效方法(推荐!)
Mar 17 MySQL
Innodb存储引擎中的后台线程详解
Apr 03 MySQL
一文了解MYSQL三大范式和表约束
Apr 03 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中JSON的应用技巧
2015/10/10 PHP
Zend Framework教程之模型Model基本规则和使用方法
2016/03/04 PHP
php版微信小店API二次开发及使用示例
2016/11/12 PHP
PHP重定向与伪静态区别
2017/02/19 PHP
详解PHP PDO简单教程
2019/05/28 PHP
javascript Zifa FormValid 0.1表单验证 代码打包下载
2007/06/08 Javascript
javascript attachEvent和addEventListener使用方法
2009/03/19 Javascript
JavaScript isArray()函数判断对象类型的种种方法
2010/10/11 Javascript
jQuery数组处理代码详解(含实例演示)
2012/02/03 Javascript
Jquery使用Firefox FireBug插件调试Ajax步骤讲解
2013/12/02 Javascript
jquery序列化表单去除指定元素示例代码
2014/04/10 Javascript
显示今天的日期js代码(阳历和农历)
2014/09/30 Javascript
Js+php实现异步拖拽上传文件
2015/06/23 Javascript
Jquery中巧用Ajax的beforeSend方法
2016/01/20 Javascript
JS中的二叉树遍历详解
2016/03/18 Javascript
jQuery弹出窗口打开链接的实现代码
2016/12/24 Javascript
Bootstrap 3 进度条的实现
2017/02/22 Javascript
使用命令行工具npm新创建一个vue项目的方法
2017/12/27 Javascript
vue.js中实现登录控制的方法示例
2018/04/23 Javascript
基于Express框架使用POST传递Form数据
2019/08/10 Javascript
vue项目初始化到登录login页面的示例
2019/10/31 Javascript
js实现蒙版效果
2020/01/11 Javascript
[01:01:43]EG vs VP 2018国际邀请赛淘汰赛BO3 第二场 8.24
2018/08/25 DOTA
python中字典(Dictionary)用法实例详解
2015/05/30 Python
Python----数据预处理代码实例
2019/03/20 Python
Python序列对象与String类型内置方法详解
2019/10/22 Python
Flask 上传自定义头像的实例详解
2020/01/09 Python
简单了解python调用其他脚本方法实例
2020/03/26 Python
CSS3的常见transformation图形变化用法小结
2016/05/13 HTML / CSS
Nike英国官网:Nike.com (UK)
2017/02/13 全球购物
播音主持专业个人自我评价
2014/01/09 职场文书
标准大学生职业生涯规划书写作指南
2014/09/18 职场文书
授权委托书(法人单位用)
2014/09/29 职场文书
幼儿园辞职信范文
2015/02/27 职场文书
创业计划书之暑假培训班
2019/11/09 职场文书
golang的文件创建及读写操作
2022/04/14 Golang