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原数据锁应用内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 详细分析mysql MDL元数据锁

    前言: 当你在MySQL中执行一条SQL时,语句并没有在你预期的时间内执行完成,这时候我们通常会登陆到MySQL数据库上查看是不是出了什么问题,通常会使用的一个命令就是 show processlist,看看有哪些session,这些session在做什么事情.当你看到 waiting for table metadata lock 时,那就是遇到MDL元数据锁了.本篇文章将会介绍MDL锁的产生与排查过程. 1.什么是MDL锁 MDL全称为metadata lock,即元数据锁.MDL锁主要作用

  • MySQL数据库事务与锁深入分析

    一.基本概念 事务是指满足ACID特性的的一组操作,可以通过Commit提交事务,也可以也可以通过Rollback进行回滚.会存在中间态和一致性状态(也是真正在数据库表中存在的状态) 二.ACID Atomicity[原子性]:事务被视为不可分割的最小单元,事务的所有操作要么全部提交成功,要么全部失败回滚.回滚可以用回滚日志(undo Log)来实现,回滚日志记录着事务所执行的修改操作,在回滚时反向执行这些修改操作即可 undoLog:为了满足事务的原子性,在操作任何数据之前,首先将数据备份到U

  • MySQL如何查看元数据锁阻塞在哪里

    MySQL如何查看元数据锁阻塞在哪里 操作步骤: 1.session 1 执行: start transaction; select *from t1; 2.session 2 在第1步执行完后执行: drop table t1; 此时session 2的drop语句被阻塞.那么怎么分析查看元数据锁呢? 方法: 1)执行show processlist;,可以看到drop语句在等待元数据锁 mysql> show processlist; +----+-------------+--------

  • MySQL数据库的一次死锁实例分析

    1.故事起因于2016年11月15日的一个生产bug.业务场景是:归档一个表里边的数据到历史表里边,同是删除主表记录. 2.背景场景简化如下(数据库引擎InnoDb,数据隔离级别RR[REPEATABLE]) -- 创建表test1 CREATE TABLE test1 ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(10) NOT NULL, PRIMARY KEY (id) ); insert into test1 values('hel

  • MySQL数据库之Purge死锁问题解析

    Purge死锁 场景说明 Purge死锁说明 表中存在记录(unique key) 10,20,30,40 (且有 自增主键 ),现在删除记录 20 ,并且已经 提交 了该事物. purge 线程此时还 没有回收 该记录,且此时又 插入 新的记录 20 . +------+------+------+------+ orignal | 10 | 20 | 30 | 40 | unique +------+------+------+------+ delete 20 +------+------

  • MySQL数据库锁机制原理解析

    在并发访问情况下,很有可能出现不可重复读等等读现象.为了更好的应对高并发,封锁.时间戳.乐观并发控制(乐观锁).悲观并发控制(悲观锁)都是并发控制采用的主要技术方式. 锁分类 ①.按操作划分:DML锁,DDL锁 ②.按锁的粒度划分:表级锁.行级锁.页级锁 ③.按锁级别划分:共享锁.排他锁 ④.按加锁方式划分:自动锁.显示锁 ⑤.按使用方式划分:乐观锁.悲观锁 乐观锁和悲观锁 乐观并发控制和悲观并发控制是并发控制采用的主要方法.乐观锁和悲观锁不仅在关系数据库里应用,在Hibernate.Memca

  • MySQL数据库表被锁、解锁以及删除事务详解

    目录 背景 故障追踪 解决方案 第一步:查看表使用 第二步:查看进程 第三步:查看当前运行的所有事务 第四步:查看当前出现的锁 第五步:查询锁等待的对应关系 第六步:kill掉事务 MySQL的锁 MySQL锁表场景 Waiting for table metadata lock 场景一:长事务运行,阻塞DDL,继而阻塞所有同表的后续操作. 场景二:为提交事务,阻塞DDL,继而阻塞所有同表的后续操作. 场景三:显式事务失败操作获得锁,未释放 小结 总结 背景 在程序员的职业生涯中,总会遇到数据库

  • mysql数据库锁的产生原因及解决办法

    数据库和操作系统一样,是一个多用户使用的共享资源.当多个用户并发地存取数据 时,在数据库中就会产生多个事务同时存取同一数据的情况.若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性.加锁是实现数据库并 发控制的一个非常重要的技术.在实际应用中经常会遇到的与锁相关的异常情况,当两个事务需要一组有冲突的锁,而不能将事务继续下去的话,就会出现死锁,严 重影响应用的正常执行. 在数据库中有两种基本的锁类型:排它锁(Exclusive Locks,即X锁)和共享锁(Share Lock

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

    MySQL 中原数据锁是系统自动控制添加的,对于用户来说无需显示调用,当我们使用一张表的时候就会加上原数据锁. 原数据锁的作用是为了保护表原数据的一致性,如果在表上有活动事务的时候,不可以对元数据进行写入操作.也就是为了避免DML 和DDL 之间的冲突,保证读写的正确性. 说白了就是,在对数据表进行读写操作的时候,不能进行修改表结构的操作. 如上图所示,在执行select 操作的时候,MySQL 会自动加上shared_read 锁,在insert,update, delete 以及 selec

  • MySQL 原理与优化之Update 优化

    前言: 谈到Update 语句大家可能不会陌生,很多情况下我们都会使用它来更新table中的记录.一般而言我们会使用innodb 的存储引擎,innodb引擎是基于行锁的,具体一点说是针对索引来加锁的(保证锁不能失效),并不是针对记录加锁,如果对于没有建立索引的字段进行过滤操作,从而执行update 的话,会导致表锁 . 今天就看看在使用innodb的时候如何使用update 语句. 已经存在course 表,其内容如下: 目前该表没有加任何的索引,默认情况下id 是表的索引. 接着让我们分别开

  • MySQL 原理与优化之Limit 查询优化

    假设有表tb_sku,其表结构如下: 表中大约有200w条记录,执行如下的sql 语句大约 4.36s 返回数据 select count(*) from tb_sku; 接着我们使用 对其进行分页查找: select * from tb_sku limit 0,10; limit 语句 其中0 代表起始位置,10 为每页返回的数据数量. 如上图所示,很快就返回了查询结果. 接着我们再使用SQL 语句 select * from tb_sku limit 10,10; 语句从记录位置10的位置开

  • MySQL Limit性能优化及分页数据性能优化详解

    MySQL Limit可以分段查询数据库数据,主要应用在分页上.虽然现在写的网站数据都是千条级别,一些小的的优化起的作用不大,但是开发就要做到极致,追求完美性能.下面记录一些limit性能优化方法. Limit语法: SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset LIMIT子句可以被用于强制 SELECT 语句返回指定的记录数.LIMIT接受一个或两个数字参数.参数必须是一个整数常量. 如果给定两个参数,第一个参数指定

  • MySQL执行update语句和原数据相同会再次执行吗

    背景 本文主要测试MySQL执行update语句时,针对与原数据(即未修改)相同的update语句会在MySQL内部重新执行吗? 测试环境 MySQL5.7.25 Centos 7.4 binlog_format为ROW 参数 root@localhost : (none) 04:53:15> show variables like 'binlog_row_image'; +------------------+-------+ | Variable_name | Value | +------

  • 详解MySQL索引原理以及优化

    前言 本文是美团一位大佬写的,还不错拿出来和大家分享下,代码中嵌套在html中sql语句是java框架的写法,理解其sql要执行的语句即可. 背景 MySQL凭借着出色的性能.低廉的成本.丰富的资源,已经成为绝大多数互联网公司的首选关系型数据库.虽然性能出色,但所谓"好马配好鞍",如何能够更好的使用它,已经成为开发工程师的必修课,我们经常会从职位描述上看到诸如"精通MySQL"."SQL语句优化"."了解数据库原理"等要求.我

  • mysql查询优化之100万条数据的一张表优化方案

    1.两种查询引擎查询速度(myIsam 引擎 ) InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行. MyISAM只要简单的读出保存好的行数即可. 注意的是,当count(*)语句包含 where条件时,两种表的操作有些不同,InnoDB类型的表用count(*)或者count(主键),加上where col 条件.其中col列是表的主键之外的其他具有唯一约束索引的列.这样查询时速度会很快.就是可

  • MySql 知识点之事务、索引、锁原理与用法解析

    本文实例讲述了MySql 知识点之事务.索引.锁原理与用法.分享给大家供大家参考,具体如下: 事务 事务概念 事务就是一组原子性的SQL查询,或者说一个独立的工作单元.如果数据库引擎执行一组操作语句,那么久执行所有的操作,如果其中有任何一条崩溃或其他原因无法执行,所有语句将不会执行.也就是说事务内的语句,要么全部执行成功,要么全部执行失败. 事务特性ACID 原子性(atomicity) 一个事务被视为最小工作单元,不可拆分,整个事务所有的操作要么全部提交成功,要么全部失败回滚,不可只执行部分.

  • MySQL JOIN关联查询的原理及优化

    目录 1 关联查询的执行 2 没有索引的算法 1 关联查询的执行 关联查询的执行过程是:先遍历关联表t1(驱动表,全表扫描),然后根据从表t1中取出的每行数据中的a值,去表t2(被关联表,被驱动表)中查找满足条件的记录,可以走t2的索引搜索.在形式上,这个过程就跟我们写程序时的嵌套查询类似,并且可以用上被驱动表的索引,所以我们称之为“Index Nested-Loop Join”,简称NLJ.在join语句的执行流程中,驱动表是走全表扫描,而被驱动表是走索引树搜索. 假设被驱动表的行数是M.每次

  • MySQL 临时表的原理以及优化方法

    目录 1 临时表 2 union临时表优化 3 group by临时表优化 1 临时表 sort buffer.内存临时表和join buffer,这三个数据结构都是用来存放语句执行过程中的中间数据,以辅助SQL语句的执行的.其中,在排序的时候用到了sort buffer,在使用join语句的时候用到了join buffer. 而使用临时表的时候,Explain的Extra字段中具有Using temporary标记.union.group by.distinct等等查询都有可能使用到临时表.

随机推荐