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数据库并展示在前端页面的实现代码
May 02 MySQL
MySQL通过binlog恢复数据
May 27 MySQL
Navicat for MySQL的使用教程详解
May 27 MySQL
Mysql中where与on的区别及何时使用详析
Aug 04 MySQL
Mysql数据库中datetime、bigint、timestamp来表示时间选择,谁来存储时间效率最高
Aug 23 MySQL
教你如何让spark sql写mysql的时候支持update操作
Feb 15 MySQL
MySQL数据库查询进阶之多表查询详解
Apr 08 MySQL
MySQL脏读,幻读和不可重复读
May 11 MySQL
MYSQL事务的隔离级别与MVCC
May 25 MySQL
MySql如何将查询的出来的字段进行转换
Jun 14 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
通过ODBC连接的SQL SERVER实例
2006/10/09 PHP
js操作textarea方法集合封装(兼容IE,firefox)
2011/02/22 Javascript
解析javascript 浏览器关闭事件
2013/07/08 Javascript
如何让浏览器支持jquery ajax load 前进、后退功能
2014/06/12 Javascript
js调试系列 断点与动态调试[基础篇]
2014/06/18 Javascript
JS拖动鼠标画出方框实现鼠标选区的方法
2015/08/05 Javascript
jQuery的选择器中的通配符[id^='code']或[name^='code']及jquery选择器总结
2015/12/24 Javascript
原生JS和jQuery版实现文件上传功能
2016/04/18 Javascript
jQuery事件委托代码实践详解
2019/06/21 jQuery
js中火星坐标、百度坐标、WGS84坐标转换实现方法示例
2020/03/02 Javascript
Vue 组件的挂载与父子组件的传值实例
2020/09/02 Javascript
[14:36]2014 DOTA2国际邀请赛中国区预选赛5.21 Orenda VS NE
2014/05/22 DOTA
[01:06:54]DOTA2-DPC中国联赛 正赛 SAG vs DLG BO3 第二场 2月28日
2021/03/11 DOTA
Python中的ceil()方法使用教程
2015/05/14 Python
全面了解Python的getattr(),setattr(),delattr(),hasattr()
2016/06/14 Python
Python 错误和异常代码详解
2018/01/29 Python
Python图像处理之简单画板实现方法示例
2018/08/30 Python
Python递归调用实现数字累加的代码
2020/02/25 Python
Python AutoCAD 系统设置的实现方法
2020/04/01 Python
Cpython解释器中的GIL全局解释器锁
2020/11/09 Python
选购世界上最好的美妆品:Cult Beauty
2017/11/03 全球购物
法国设计制造的扫帚和刷子:Andrée Jardin
2018/12/06 全球购物
大学生文员专业个人求职信范文
2014/01/05 职场文书
秋季运动会表扬稿
2014/01/16 职场文书
志愿者服务感言
2014/02/27 职场文书
大学生个人求职信例文
2014/07/07 职场文书
声乐专业大学生职业生涯规划书:理想的未来需要自己去打造
2014/09/20 职场文书
认错检讨书
2014/10/02 职场文书
2014年发展党员工作总结
2014/11/12 职场文书
2015年教师师德师风承诺书
2015/04/28 职场文书
民事起诉书范本
2015/05/19 职场文书
楚门的世界观后感
2015/06/03 职场文书
后天观后感
2015/06/08 职场文书
Vue的生命周期一起来看看
2022/02/24 Vue.js
Nginx虚拟主机的配置步骤过程全解
2022/03/31 Servers
利用Redis实现点赞功能的示例代码
2022/06/28 Redis