MySQL-锁(LOCK)

news2024/11/29 10:56:30

文章目录

    • 1. 锁是什么?
    • 2. 全局锁
      • 2.1 相关语法
      • 2.2 特点
    • 3. 表级锁
      • 3.1 表锁
        • 3.1.1 共享读锁(S)
        • 3.1.2 排它写锁(X)
      • 3.2 元数据锁(MDL)
      • 3.2 意向锁(IS、IX)
    • 4. 行级锁
      • 4.1 行锁
    • 5. 死锁
      • 5.1 死锁检测
      • 5.2 避免死锁

1. 锁是什么?

  • 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源(CPU、RAM、I/O)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。
  • MySQL中的锁,为了尽可能提高数据库的并发量,每次锁定的数据范围越小越好,越小的锁其耗费的系统资源越多,系统性能下降。为在高并发响应和系统性能两方面进行平衡,这样就产生了“锁粒度”的概念。 按照锁的粒度分,分为以下三类:
    1. 全局锁:锁定数据库中的所有表。
    2. 表级锁:每次操作锁住整张表。
    3. 行级锁:每次操作锁住对应的行数据。
  • 从锁的角度来说,表级锁适合以查询为主,只有少量按索引条件更新数据的应用,如 Web 应用。而行级锁更适合于有大量按索引条件,同时又有并发查询的应用,如一些在线事务处理( OLTP)系统

2. 全局锁

  • 全局锁就是对整个数据库实例加锁,加锁后整个实例就处于只读状态,后续的DML的写语句,DDL语句,已经更新操作的事务提交语句都将被阻塞。典型的使用场景是做全库的逻辑备份,对所有的表进行锁定,从而获取一致性视图,保证数据的完整性。

    在这里插入图片描述

    对数据库进行进行逻辑备份之前,先对整个数据库加上全局锁,一旦加了全局锁之后,其他的DDL、DML全部都处于阻塞状态,但是可以执行DQL语句,也就是处于只读状态,而数据备份就是查询操作。那么数据在进行逻辑备份的过程中,数据库中的数据就是不会发生变化的,这样就保证了数据的一致性和完整性。

2.1 相关语法

  1. 加全局锁:

    flush tables with read lock ;
    
  2. 数据备份:

    mysqldump -uroot –p1234 db_name > db_name.sql
    
  3. 释放锁:

    unlock tables ;
    

2.2 特点

  • 数据库中加全局锁,是一个比较重的操作,存在以下问题:

    • 如果在主库上备份,那么在备份期间都不能执行更新,业务基本上就得停摆

    • 如果在从库上备份,那么在备份期间从库不能执行主库同步过来的二进制日志(binlog),会导致主从延迟

      在InnoDB引擎中,我们可以在备份时加上参数 --single-transaction 参数来完成不加锁的一致性数据备份。

      mysqldump --single-transaction -uroot –p123456 db_name > db_name.sql
      

3. 表级锁

3.1 表锁

  • 对于表锁,分为两类:表共享读锁(read lock)表排它写锁(write lock)

  • 语法:

    • 加锁:

      lock tables 表名... read/write
      
    • 释放锁:

      unlock tables
      
3.1.1 共享读锁(S)
  • 共享锁的代号是 S,是 Share 的缩写,也可称为读锁。是一种可以查看但无法修改和删除的数据锁。

  • 共享锁的锁粒度是行或者元组(多个行)。一个事务获取了共享锁之后,可以对锁定范围内的数据执行读操作。会阻止其它事务获得相同数据集的排他锁。简单来说就是获得读锁的事务A与其他事务B都可以对锁范围内的数据进行读操作,但都不能进行写操作

    在这里插入图片描述

3.1.2 排它写锁(X)
  • 排他锁的代号是 X,是 eXclusive 的缩写,也可称为写锁,是基本的锁类型。

  • 排他锁的粒度与共享锁相同,也是行或者元组。一个事务获取了排他锁之后,可以对锁定范围内的数据执行写操作。允许获得排他锁的事务更新数据,阻止其它事务取得相同数据集的共享锁和排他锁。简单来说就是获得写锁的事务A可以对锁范围内的数据进行读和写,但其他事务B不能对锁范围内的数据进行读和写

    在这里插入图片描述

3.2 元数据锁(MDL)

  • meta data lock , 元数据锁,简写MDL。MDL加锁过程是系统自动控制,无需显式使用,在访问一张表的时候会自动加上。MDL锁主要作用是维护表元数据的数据一致性,在表上有活动事务的时候,不可以对元数据进行写入操作。为了避免DML与DDL冲突,保证读写的正确性。这里的元数据,大家可以简单理解为就是一张表的表结构。 也就是说,某一张表涉及到未提交的事务时,是不能够修改这张表的表结构的

  • 在MySQL5.5中引入了MDL,当对一张表进行增删改查的时候,加MDL读锁(共享);当对表结构进行变更操作的时候,加MDL写锁(排他)。

  • 常见的SQL操作时,所添加的元数据锁:

    对应SQL锁类型说明
    lock tables xxx read / writeSHARED_READ_ONLY / SHARED_NO_READ_WRITE
    select 、select … lock in share modeSHARED_READ与SHARED_READ、 SHARED_WRITE兼容,与 EXCLUSIVE互斥
    insert 、update、 delete、select … for updateSHARED_WRITE与SHARED_READ、 SHARED_WRITE兼容,与 EXCLUSIVE互斥
    alter table …EXCLUSIVE与其他的MDL都互斥

3.2 意向锁(IS、IX)

  • 为了允许行锁和表锁共存,实现多粒度锁机制InnoDB 还有两种内部使用的意向锁。意向锁是一种表锁,锁定的粒度是整张表,分为**意向共享锁( IS)意向排他锁( IX)**两类。

  • 添加意向共享锁:

    select ... lock in share mode
    
  • 添加意向排它锁:

    insert、update、delete、select...for update
    
  • 其中共享锁排他锁意向共享锁意向排他锁相互之间的兼容/互斥关系如下表所示,其中 Y 表示相容, N 表示互斥。

    参数XSIXIS
    X(排他锁)NNNN
    S(共享锁)NYNY
    IX(意向排他锁)NNYY
    IS(意向共享锁)NYYY

    如果一个事务请求的锁模式与当前的锁兼容, InnoDB 就将请求的锁授予该事务;反之,如果两者不兼容,该事务就要等待锁释放。

4. 行级锁

  • 在 MySQL 中, InnoDB 行锁通过给索引上的索引项加锁来实现,如果没有索引, InnoDB 将通过隐藏的聚簇索引来对记录加锁。

  • InnoDB的行锁是针对于索引加的锁,如果不通过索引条件检索数据,那么InnoDB将对表中的所有记录加锁,此时就会升级为表锁

  • InnoDB 支持 3 种行锁定方式:

    1. 行锁( Record Lock):直接对索引项加锁。

      select * from student where id = 1 for update;
      
    2. 间隙锁( Gap Lock):锁加在索引项之间的间隙,也可以是第一条记录前的“间隙”或最后一条记录后的“间隙”。

      select * from student where id > 2 and id < 5 for update;
      
    3. Next-Key Lock:行锁与间隙锁组合起来用就叫做 Next-Key Lock。 前两种的组合,对记录及其前面的间隙加锁

      select * from student where id > 4 for update;
      

4.1 行锁

  • InnoDB实现了以下两种类型的行锁:

    1. 共享锁(S):允许一个事务去读一行,阻止其他事务获得相同数据集的排它锁。
    2. 排他锁(X):允许获取排他锁的事务更新数据,阻止其他事务获得相同数据集的共享锁和排他锁。

  • 常见的SQL语句,在执行时,所加的行锁如下:

    SQL行锁类型说明
    INSERT …排他锁自动加锁
    UPDATE …排他锁自动加锁
    DELETE …排他锁自动加锁
    SELECT(正常)不加任何 锁
    SELECT … LOCK IN SHARE MODE共享锁需要手动在SELECT之后加LOCK IN SHARE MODE
    SELECT … FOR UPDATE排他锁需要手动在SELECT之后加FOR UPDATE

5. 死锁

  • 定义:死锁是指两个或两个以上的事务在执行过程中,因争夺资源而造成的一种互相等待的现象。 就是所谓的锁资源请求产生了回路现象,即死循环,此时称系统处于死锁状态或系统产生了死锁。常见的报错信息为“Deadlock found when trying to get lock…”。
  • 解决方案:死锁发生以后,只有部分或完全回滚其中一个事务,才能打破死锁。多数情况下只需要重新执行因死锁回滚的事务即可。

5.1 死锁检测

  • InnoDB的并发写操作会触发死锁,同时 InnoDB 也提供了死锁检测机制。通过设置 innodb_deadlock_detect 参数的值来控制是否打开死锁检测。
  1. innodb_deadlock_detect = ON默认值,打开死锁检测。数据库发生死锁时,系统会自动回滚其中的某一个事务, 让其它事务可以继续执行。

  2. innodb_deadlock_detect = OFF:关闭死锁检测。发生死锁时,系统会用锁等待来处理。

    锁等待是指在事务过程中产生的锁,其它事务需要等待上一个事务释放锁,才能占用该资源。如果该事务一直不释放,就需要持续等待下去,直到超过了锁等待时间。 当超过锁等待允许的最大时间,就会出现死锁,然后当前事务执行失败,自动执行回滚操作。

5.2 避免死锁

  • 在实际应用中,我们要尽量防止锁等待现象的发生,下面介绍几种避免死锁的方法:
    1. 如果不同程序会并发存取多个表,或者涉及多行记录时,尽量约定以相同的顺序访问表,这样可以大大降低死锁的发
      生。
    2. 业务中要及时提交或者回滚事务,可减少死锁产生的概率。
    3. 在同一个事务中,尽可能做到一次锁定所需要的所有资源,减少死锁产生概率。
    4. 对于非常容易产生死锁的业务部分,可以尝试使用升级锁粒度,通过表锁定来减少死锁产生的概率(表级锁不会产生死锁)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1455765.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

『随处指挥』:用这款APP,世界听你的!

在这个科技日新月异的时代&#xff0c;我们的生活被各种手机软件所包围。几乎每个人都有一个甚至多个手机&#xff0c;你是否也有遇到过需要远程操作自己某一台手机的场景呢&#xff1f;今天&#xff0c;我要向大家推荐一款神奇的手机远程操作神器&#xff0c;让你可以随时随地…

VTK使用指南:介绍

1、什么是可视化&#xff1f; 术语 不同的术语用于描述可视化。科学可视化是计算机科学领域的正式名称&#xff0c;包括用户界面、数据表示和处理算法、视觉表示和其他感官表示&#xff0c;如声音或触摸。术语数据可视化是用于描述可视化的另一个短语。数据可视化通常被解释为…

Apache Apisix网关系统历史漏洞复现分析

文章目录 前言CVE-2020-13945默认api令牌CVE-2021-45232未授权接口2.1 默认账户密码导致RCE2.2 未授权访问api接口RCE CVE-2022-24112 地址限制绕过CVE-2022-29266 JWT令牌伪造4.1 漏洞源码简析与修复4.2 漏洞环境搭建与复现 总结 前言 Apache APISIX 是一个动态、实时、高性能…

探索Linux系统中HTTP隧道技术的原理与实践

在Linux的世界里&#xff0c;HTTP隧道技术就像是一个神秘的魔法师&#xff0c;它能让你的网络请求穿越重重障碍&#xff0c;安全地到达目的地。今天&#xff0c;我们就来一起探索这个魔法师的奥秘&#xff0c;看看它是如何在Linux系统中施展魔法的。 首先&#xff0c;我们要明…

PFH特征描述符、对应关系可视化以及ICP配准

一、PFH特征描述符可视化 C #include <pcl/point_types.h> #include <pcl/point_cloud.h> #include <pcl/search/kdtree.h> #include <pcl/io/pcd_io.h> #include <pcl/features/normal_3d_omp.h>//使用OMP需要添加的头文件 #include <boos…

PyCharm - Project Interpreter (项目解释器)

PyCharm - Project Interpreter [项目解释器] References File -> Settings… -> Project: -> Project Interpreter References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

深入探讨Lambda表达式转换为委托类型的编译过程

了解了&#xff0c;如果要深入探讨Lambda表达式转换为委托类型的编译过程&#xff0c;我们需要关注C#编译器如何处理这个转换。这个过程涉及到编译时的类型推断、匿名方法的创建&#xff0c;以及生成对应的委托实例。我们来更详细地分析这个过程&#xff1a; 编译阶段 1. 解…

21. Merge Two Sorted Lists(合并两个有序链表)

问题描述 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 问题分析 我们只需要使用两个指针分别从两个链表的头部向后遍历整个链表&#xff0c;每一个次都让量个元素比较大小&#xff0c;小的元素并入的新的链表&#xf…

MySQL(1/3)

基本命令行操作 命令行连接 mysql -uroot -p 回车&#xff0c;然后在下一行输入密码&#xff0c;或者直接在p后写密码 修改密码 updata mysql.user set authentication_stringpassword(原密码) where userroot and Host localhost; 刷新权限 flush privileges; 查看所有数据库…

数据库索引面试的相关问题

查看索引的执行计划 索引失效的情况 1、索引列上做了计算&#xff0c;函数&#xff0c;类型转换等操作。索引失效是因为查询过程需要扫描整个索引并回表。代价高于直接全表扫描。 Like匹配使用了前缀匹配符“%abc” 字符串不加引号导致类型转换。 原因&#xff1a; 常见索…

03 SS之返回JSON+UserDetail接口+基于数据库实现RBAC

1. 返回JSON 为什么要返回JSON 前后端分离成为企业应用开发中的主流&#xff0c;前后端分离通过json进行交互&#xff0c;登录成功和失败后不用页面跳转&#xff0c;而是给前端返回一段JSON提示, 前端根据JSON提示构建页面. 需求: 对于登录的各种状态 , 给前端返回JSON数据 …

面向对象编程(三)

目录 1. 关键字&#xff1a;static 1.1 类属性、类方法的设计思想 1.2 static关键字 1.3 静态变量 1.3.1 语法格式 1.3.2 静态变量的特点 1.3.3 举例 1.3.4 内存解析 1.4 静态方法 1.4.1 语法格式 1.4.2 静态方法的特点 1.4.3 举例 2. 单例(Singleton)设计模式 2…

HarmonyOS router页面跳转

默认启动页面index.ets import router from ohos.router import {BusinessError} from ohos.baseEntry Component struct Index {State message: string Hello World;build() {Row() {Column() {Text(this.message).fontSize(50).fontWeight(FontWeight.Bold)//添加按钮&am…

简约火箭发射静态404错误页面源码

简约火箭发射静态404错误页面源码&#xff0c;源码由HTMLCSSJS组成,记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面&#xff0c;重定向这个界面 蓝奏云下载&#xff1a;https://wfr.lanzout.com/iK…

烦人的鼠标唤醒电脑功能彻底禁用

1.常规操作禁用鼠标唤醒 搜索设备 电源管理取消勾选 这样操作后, 系统更新等各种原因, 又会失效, 需要反复操作, 很烦 2.关闭计算机管理的计划任务 禁用 3.查询唤醒原因 powercfg /waketimers powercfg /lastwake

多模态学习综述(MultiModal Learning)

最早开始关注到多模态机器学习是看到Jeff Dean在2019年年底NeurIPS大会上的一个采访报道&#xff0c;讲到了2020年机器学习趋势&#xff1a;多任务和多模态学习将成为突破口。 Jeff Dean 谈2020年机器学习趋势&#xff1a;多任务和多模式学习将成为突破口 站在2022年&#xff…

华为模拟器防火墙配置实验(四)

实验拓扑图 需求&#xff1a; 1&#xff0c;办公区设备可以通过电信链路和移动链路正常上网&#xff08;多对多的NAT&#xff0c;并且需要保存一个公网IP不能用来转换&#xff09; 2&#xff0c;分公司的设备可以通过总公司的移动链路和电信链路访问DMZ区域的http服务器 3&…

VSCODE上使用python_Django

接上篇 https://blog.csdn.net/weixin_44741835/article/details/136135996?csdn_share_tail%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22136135996%22%2C%22source%22%3A%22weixin_44741835%22%7D VSCODE官网&#xff1a; Editing Python …

python+django咖啡网上商城网站

全网站共设计首页、咖啡文化、咖啡商城、个人信息、联系我们5个栏目以及登录、注册界面&#xff0c;让用户能够全面的了解中国咖啡咖啡文化宣传网站以及一些咖啡知识、文化。 栏目一首页&#xff0c;主要放置咖啡的起源及发展进程的图文介绍&#xff1b;栏目二咖啡文化&#xf…

FPGA 高速接口(LVDS)

差分信号环路测试 1 概述 LVDS&#xff08;Low Voltage Differential Signalin&#xff09;是一种低振幅差分信号技术。它使用幅度非常低的信号&#xff08;约350mV&#xff09;通过一对差分PCB走线或平衡电缆传输数据。大部分高速数据传输中&#xff0c;都会用到LVDS传输。 …