iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >MySQL的锁机制之全局锁和表锁的实现
  • 197
分享到

MySQL的锁机制之全局锁和表锁的实现

MySQL全局锁和表锁MySQL全局锁MySQL表锁 2023-01-15 10:01:13 197人浏览 独家记忆
摘要

前言 对Mysql锁的总结学习,本文将围绕,加锁的概念,加锁的应用场景和优化,以及不加锁会导致的问题这些方向进行总结学习。mysql的全局锁和表锁是本文的重点 一、全局锁 全局锁的介绍以及使用 全局锁就是对整个数据库实例

前言

Mysql总结学习,本文将围绕,加锁的概念,加锁的应用场景和优化,以及不加锁会导致的问题这些方向进行总结学习。mysql的全局锁和表锁是本文的重点

一、全局锁

全局锁的介绍以及使用

全局锁就是对整个数据库实例进行加锁。
Mysql提供了一个加全局读锁的方法,如下:
全局读锁定:

FLUSH TABLES WITH READ LOCK ;

执行了命令之后所有库所有表都被锁定只读,解锁:

UNLOCK TABLES ;

加了全局读锁之后,整个数据库都处于只读的状态,当其他线程有数据更新语句(数据的增删改)、数据定义语句(包括建表、修改表结构等)和更新事务的提交语句都将会被阻塞。

全局锁的应用场景

了解了全局锁的基本概念后,心想全局锁的锁粒度这么大,效率肯定特别低,应该很少使用吧。但是开发者设计出来这个,肯定有它的使用场景啊。接下来我们看下:
通过学习了解到,全局锁最经典最常用的场景是用做全库逻辑备份 (就是把整个库的每个表select出来存放成文本)
把整个数据库都锁住,不能有更新操作,想想都危险,锁的粒度太大了。
比如:
如果在用户访问高峰期,这期间需要数据库的有关表进行更新操作。这是如果你备份整个库是在主库上备份,那么备份期间都不能执行更新操作,这是业务基本上就得停摆,影响用户体验。而如果你选择在从库上备份,那么备份期间从库不能执行主库同步过来的binlog,会导致主从延迟。

此时,你肯定想那加锁这么麻烦危险,那还不如不加锁呢。如果不加锁会导致什么后果呢

不加锁导致的危害

这里我举个简单的购物例子,你就瞬间清楚了。
比如,购物。我在某网站上买了一件商品,同时维护这网站的也准备发起一个数据库的逻辑备份。
如果时间顺序上是先备份我们用户的账号余额表,然后用户购买,然后备份用户商品表。
此时,会出现什么问题呢。结果会发现,我们用户的账号余额没减少,但是多了件购买的商品。这也是不是感觉挺好,我们用户赚大了啊。不过如果反过来呢,那我们岂不是亏大了。

反观,会出现这么一个现象的原因是什么,其实就是备份的库,备份的库中的表不是一个逻辑时间点的,即前后没有一致性。

提到一致性,我们会想到那不直接在可重读隔离级别下开启一个事务,进行数据逻辑备份不就好了吗,那岂不是比加锁好。

想法挺好的,但是也需要系统支持啊。比如像MyISAM这种不支持事务的引擎,只能通过FTWRL方法了。

加锁和其他方法对比

通过上面可以知道,整个库进行备份,就是先把整个库通过加全局读锁,把整个库设置成只读状态。
此时,你肯定会想,把整个库设置成只读状态,我还知道使用如下命令进行设置啊,不必要加锁啊

set global readonly=true;

确实,readonly这种方式也可以让全库进入只读状态。但是对于一些特殊情况,如在异常处理机制上,如果执行FTWRL命令之后,客户端发生异常断开,那么MySQL会自动释放这个全局锁,整个库回到可以正常更新的状态,而将这个库设置为readonly之后,如果客户端发生异常,则数据库就会一直保持readonly状态,这样会导致整个库长时间处于不可写状态;所以还是建议使用全局锁比较合适

了解完了全局锁,接下来我们再来学习以下表锁

二、表锁

表锁的介绍以及使用

MySQL里面表级别的锁有两种:一种是表锁,一种是元数据锁(meta data lock,MDL)。

对于表锁,加锁的语句是:

LOCK TABLES tbl_name ; #不影响其他表的写操作

解锁的语句是:

UNLOCK TABLES ;

另一类表级的锁是 MDL(metadata lock) 。MDL不需要显式使用,在访问一个表的时候会被自动加上。

表锁的应用场景

针对表锁,在MySQL发展初级阶段,没有设计出更细粒度的锁时,表锁经常被用于处理并发(InnoDB支持行锁所以一般不会使用表锁)。举个例子,如果在某个线程A中执行lock tables t1 read, t2 write;这个语句,则其他线程写t1、读写t2的语句都会被阻塞。同时,线程A在执行unlock table之前,也只能执行读t1、读写t2的操作。连写t1都不允许,自然也不能访问其他表。

对于MDL锁,是访问一个表的时候自动加上的。为什么呢,这也是因为时间逻辑点的不同。比如,如果一个查询正在遍历一个表中的数据,而在此执行期间另一个线程对这个表结构做变更,删了一列,那么查询线程拿到的结果跟表结构对不上,就会出错。为此,为了解决这些问题。当对一个表做增删改查操作的时候,加MDL读锁;要对表做结构变更操作的时候,加MDL写锁。

为此需要注意的还有一点,并不是系统默认为每一访问表的操作自动添加了MDL锁就会万事大吉。比如,对于一个表t执行如下的操作:

在这里插入图片描述

session A先启动,对表t加一个MDL读锁
因为session B需要的也是读锁,可以正常执行
因为session A的MDL读锁还没有释放,而session C需要MDL写锁,因此会被阻塞
session C之后的所有要对表申请的读锁页会被session C阻塞,最终导致这个表完全不可读写
此时如果对这个表的查询比较频繁,并且客户端也有重试机制,那么这个库的线程很快就会爆满

造成这个问题的原因是,事务中的MDL锁,在执行语句的时候开始申请,但是语句结束后并不会马上释放,而是等到整个事务提交后再释放。

因此,了解了这个问题,以及这个问题出现的原因。
那么我们如何解决安全的给表加字段呢

首先要解决长事务,毕竟事务不提交,就会一直占着MDL锁。。因此如果要做DDL变更表的时候,查到刚好有长事务在执行,可以考虑暂停DDL操作或者kill掉长事务
如果要操作的表是个热点表,请求比较频繁,此时如果采用kill,那么新的请求立马就来了,未必管用。因此比较合适的操作是:在alter table语句里面设定等待时间,如果在这个指定的等待时间里面能够拿到MDL写锁最好,拿不到也不要阻塞后面的业务语句,先放弃。之后再通过重试命令重复这个过程。

到此这篇关于MySQL的锁机制之全局锁和表锁的实现的文章就介绍到这了,更多相关MySQL 全局锁和表锁内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

您可能感兴趣的文档:

--结束END--

本文标题: MySQL的锁机制之全局锁和表锁的实现

本文链接: https://www.lsjlt.com/news/177764.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MySQL的锁机制之全局锁和表锁的实现
    前言 对mysql锁的总结学习,本文将围绕,加锁的概念,加锁的应用场景和优化,以及不加锁会导致的问题这些方向进行总结学习。mysql的全局锁和表锁是本文的重点 一、全局锁 全局锁的介绍以及使用 全局锁就是对整个数据库实例...
    99+
    2023-01-15
    MySQL全局锁和表锁 MySQL全局锁 MySQL表锁
  • Mysql锁机制之行锁、表锁、死锁的实现
    目录一、Mysql锁是什么?锁有哪些类别?二、行锁和表锁的区别三、InnoDB死锁概念和死锁案例死锁场景一之select for update:死锁场景二之两个update...
    99+
    2024-04-02
  • MySQL中怎么实现全局锁和表锁
    今天就跟大家聊聊有关MySQL中怎么实现全局锁和表锁,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1. 全局锁全局锁就是对整个数据库实例加锁。MyS...
    99+
    2024-04-02
  • Mysql锁机制中行锁、表锁、死锁如何实现
    这篇文章主要介绍了Mysql锁机制中行锁、表锁、死锁如何实现,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、Mysql锁是什么?锁有哪些类别?锁定义:  ...
    99+
    2023-06-29
  • MySQL数据库中怎么实现全局锁和表级锁
    这篇文章给大家介绍MySQL数据库中怎么实现全局锁和表级锁,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1. 全局锁全局锁是粒度比较大的锁,基本上也使用不上,就像我们家的大门一样,控制...
    99+
    2024-04-02
  • 史上最详细MySQL全局锁和表锁
    原文: https://www.enmotech.com/web/detail/1/728/1.html   导读:根据加锁的范围,MySQL里面的锁大致可以分成全局锁,...
    99+
    2024-04-02
  • MySQL锁机制详解-表锁与行锁
    文章目录 1. 数据库锁理论2. 锁的分类2.1 按数据操作的类型分类2.2 按数据操作的颗粒度分类 3. 表锁的应用3.1 表锁相关命令3.2 给表加表共享读锁3.3 给表加表独占写锁...
    99+
    2023-09-11
    mysql 数据库
  • MySQL的锁机制——记录锁、间隙锁、临键锁
    记录锁(Record Locks) 记录锁锁住的是索引记录,记录锁也叫行锁。如果使用索引作为条件命中了记录,那么就是记录锁,被锁住的记录不能被别的事务插入相同的索引键值,修改和删除。 例如: select * from test_...
    99+
    2023-08-18
    mysql 数据库 java
  • mysql锁表机制的概述
    这篇文章主要介绍“mysql锁表机制的概述”,在日常操作中,相信很多人在mysql锁表机制的概述问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”mysql锁表机制的概述”的疑惑...
    99+
    2024-04-02
  • MySQL中的锁(表锁、行锁)
    锁是计算机协调多个进程或纯线程并发访问某一资源的机制。在数据库中,除传统的计算资源(CPU、RAM、I/O)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所在有数据库必须解决的一个问题,锁冲突也是影响数...
    99+
    2023-09-02
    java 算法 数据库
  • 解析MySQL锁的实现机制
    MySQL 锁的实现原理解析引言:在并发访问数据库的环境中,为了保障数据的完整性和一致性,数据库系统需要实现锁机制。锁机制通过限制对共享资源的访问,确保不同的事务能够有序地访问和修改数据。MySQL作为一种常用的关系型数据库,也提供了多种锁...
    99+
    2023-12-21
    MySQL 锁实现原理
  • MySQL中表锁和行锁机制浅析(源码篇)
    目录前言行锁mysql 事务属性事务常见问题事务的隔离级别间隙锁排他锁共享锁分析行锁定行锁优化表锁共享读锁独占写锁查看加锁情况分析表锁定什么场景下用表锁页锁补充:行级锁与死锁总结前言 众所周知,MySQL的存储引擎有My...
    99+
    2024-04-02
  • 【MySQL】说透锁机制(二)行锁 加锁规则 之 范围查询(你知道会锁表吗?)
    本文会按照 聚集集索->唯一索引->普通索引 的顺序 地毯式分析 范围查询中 = 的行锁情况,锁表分析在唯一索引 章节,万字长文,力求分析全面,很硬核全网独一份,记得收藏! 当然如果落下什么欢迎大家评论指出! 前文回顾 在上文,我们介...
    99+
    2023-08-16
    mysql 行锁 加锁规则 范围锁 锁表
  • mysql myisam的锁机制
    首先我们知道MySQL支持多种引擎,并且不同存储引擎有很多不同,最重要的 ...
    99+
    2024-04-02
  • 【MySQL】说透锁机制(三)行锁升表锁如何避免? 锁表了如何排查?
    文章目录 前言哪些场景会造成行锁升表锁?如何避免如何分析排查查看`InnoDB_row_lock%`相关变量查看 `INFORMATION_SCHEMA`系统库 总结最后 前言 在上文我们曾小小的提到过,在索引失效的情况下...
    99+
    2023-08-18
    数据库 大数据 mysql 行锁升表锁 java
  • MySQL中的锁机制
    抛砖引玉:多个查询需要在同一时刻进行数据的修改,就会产生并发控制的问题。我们需要如何避免写个问题从而保证我们的数据库数据不会被破坏。 锁的概念 读锁是共享的互相不阻塞的。多个事务在听一时刻可以同时读取同一资源,而相互不干扰。 写锁的排...
    99+
    2023-08-23
    mysql 数据库
  • MySQL的表级锁,行级锁,排它锁和共享锁是什么
    这篇文章主要介绍“MySQL的表级锁,行级锁,排它锁和共享锁是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“MySQL的表级锁,行级锁,排它锁和共享锁是什么”文章能帮助大家解决问题。前言先说下事...
    99+
    2023-07-02
  • 【MySQL】说透锁机制(一)行锁 加锁规则 之 等值查询
    文章目录 前言一、共享锁(S)和排它锁(X)二、行锁的3种算法Record LockGap LockNext-key Lock 三、加锁规则 之 等值查询分析数据准备3.1 聚集索引有匹配索引无匹配索引 3.2 唯一索引有...
    99+
    2023-08-18
    mysql 行锁 加锁规则 mysql锁 mysql行锁
  • mysql锁表解锁的方法
    这篇文章主要介绍了mysql锁表解锁的方法,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了解一下。什么是MySQL锁表?为了给高并发情况下的mysql进行...
    99+
    2024-04-02
  • MySQL全局锁指的是什么
    这篇文章主要介绍“MySQL全局锁指的是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“MySQL全局锁指的是什么”文章能帮助大家解决问题。数据库设计的初衷是处理...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作