MySQL 原理与优化之原数据锁的应用

 更新时间:2022年08月14日 10:29:29   作者:51CTO崔皓​​​​​​​  
这篇文章主要介绍了MySQL 原理与优化之原数据锁的应用,MySQL 中原数据锁是系统自动控制添加的,对于用户来说无需显示调用,当我们使用一张表的时候就会加上原数据锁

MySQL 中原数据锁是系统自动控制添加的,对于用户来说无需显示调用,当我们使用一张表的时候就会加上原数据锁。

原数据锁的作用是为了保护表原数据的一致性,如果在表上有活动事务的时候,不可以对元数据进行写入操作。也就是为了避免DML 和DDL 之间的冲突,保证读写的正确性。

说白了就是,在对数据表进行读写操作的时候,不能进行修改表结构的操作

如上图所示,在执行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;

通过上图我们可以发现,course 表加上了shared_read锁。

接着,开启另外一个事务,记住刚才的事务不要commit

begin;
update course set name = 'Jason' where id =2;

如上图所示,此时的update 语句可以执行成功,并没有被阻塞。说明select 和update 是不冲突的,他们的锁是兼容的。

再次查看原数据锁

select object_type,object_schema,object_name,lock_type,lock_duration from performance_schema.metadata_locks;

从上面的截图可以看出,此时原数据锁的表中记录了两条记录分别是针对course 表的shared_read 和 shared_write 锁,也刚好对应我们执行的select 和update 操作。

最后,我们再启动第三个客户端,并且启动 第三个事务,执行alter语句,在course 表中加入一个字段hello 如下 。

begin;
alter table course add column hello int;

由于之前的事务没有提交所以修改表的操作会被阻塞,因为shared_read 以及 shared_write 这两个锁 与 exclusive之间是互斥的,所以会阻塞

此时,回到最开始的两个客户端,对两个事务进行commit 操作,再返回到第三个事务执行的alter 语句出,发现语句顺利执行。

MySQL 原理与优化:原数据锁的应用_mysql_07

到此这篇关于MySQL 原理与优化之原数据锁的应用的文章就介绍到这了,更多相关MySQL原数据锁应用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL修改数据表存储引擎的3种方法介绍

    MySQL修改数据表存储引擎的3种方法介绍

    这篇文章主要介绍了MySQL修改数据表存储引擎的3种方法介绍,分别是直接修改、导出导入、创建插入3种方法,需要的朋友可以参考下
    2014-07-07
  • 一文带你学会MySQL的select语句

    一文带你学会MySQL的select语句

    在MySQL中可以使用SELECT语句来查询数据,查询数据是指从数据库中根据需求,使用不同的查询方式来获取不同的数据,是使用频率最高、最重要的操作,下面这篇文章主要给大家介绍了关于MySQL中select语句的相关资料,需要的朋友可以参考下
    2022-11-11
  • 总结MySQL的分区

    总结MySQL的分区

    本文先是介绍了分区,而后又分别说明了怎样判断是否支持分区和如何删除增加分区,对分区的总结很详细,下面一起来看看吧。
    2016-08-08
  • 高并发状态下Replace Into造成的死锁问题解决

    高并发状态下Replace Into造成的死锁问题解决

    本文主要介绍了高并发状态下Replace Into造成的死锁问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • MySQL优化之缓存优化

    MySQL优化之缓存优化

    在平时被问及最多的问题就是关于 MySQL 数据库性能优化方面的问题,所以最近打算写一个MySQL数据库性能优化方面的系列文章,希望对初中级 MySQL DBA 以及其他对 MySQL 性能优化感兴趣的朋友们有所帮助。
    2017-03-03
  • MySQL8安装Installer版的图文教程

    MySQL8安装Installer版的图文教程

    这篇文章主要介绍了MySQL8安装Installer版的教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • MySQL外键约束常见操作方法示例【查看、添加、修改、删除】

    MySQL外键约束常见操作方法示例【查看、添加、修改、删除】

    这篇文章主要介绍了MySQL外键约束常见操作方法,结合实例形式分析了mysql针对外键约束的查看、添加、修改、删除等相关操作实现方法,需要的朋友可以参考下
    2018-05-05
  • centos 6.4下使用rpm离线安装mysql

    centos 6.4下使用rpm离线安装mysql

    这篇文章主要为大家详细介绍了centos 6.4下使用rpm离线安装mysql的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • 如何在Windows中运行多个MySQL实例详解

    如何在Windows中运行多个MySQL实例详解

    这篇文章主要给大家介绍了关于如何在Windows中运行多个MySQL实例的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用MySQL具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-09-09
  • MySql导入CSV文件或制表符分割的文件

    MySql导入CSV文件或制表符分割的文件

    这篇文章主要为大家详细介绍了MySql导入CSV文件或制表符分割的文件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-05-05

最新评论