Mysql数据库 19.Mysql 锁

MySQL锁

锁:锁是计算机用以协调多个进程间并发访问同一共享资源的一种机制,在数据库中,除传统的计算资源(CPU、RAM、I/O)的争用以外,数据也是一种供许多用户共享的资源,如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂

锁解决的问题

解决并发事物的访问问题,解决事务发生时造成的脏读、不可重复读、幻读等问题

锁的分类

按照锁的粒度分,分为以下三类锁:

1.全局锁:锁定数据库中的所有表

2.表级锁:每次操作锁住操作表

3.行级锁:每次操作锁住操作的行数据

锁的范围、力度依次减小

全局锁(只读)

对整个数据库实例加锁,使整个库加锁后处于只读状态(不能增删改),使用该命令后,数据更新语句DML、数据定义语句DDL和更新类事物的提交语句等操作都会被阻塞

典型的应用是作全库逻辑备份,把所有表全部锁定,从而获取一致性视图,保证数据的完整性 

具体使用

1.添加全局锁

语法:flush tables with read lock;

flush tables with read lock;

添加全局锁后,不能使用任何增、删、改操作,可以使用查询操作,更新操作被阻塞

2.执行数据备份,利用MySQL提供的工具mysqldump

语法:mysqldump -uroot -proot 数据库名 > 具体存入脚本名称.sql

mysqldump -uroot -proot 数据库名 > 具体存入脚本名称.sql

3.备份之后,解锁指令(释放全局锁)

语法:unlock tables;

unlock tables;

演示:

添加全局锁
flush table with read lock; 

数据备份

释放全局锁
unlock table;

全局锁缺点(力度太大)

1.在备份期间不能执行更新操作,业务基本上就会停摆

2.如果有主从复制+读写分离的结构,在备份期间从库不能执行主库同步过来的二进制日志,会导致主从延迟。

 

表级锁 

表级锁,它的粒度为锁定整张表,每次操作锁住一张表,并且发生锁冲突的概率最高,并发度最低在InnoDB,MyISAM等常见储存引擎中支持

表级锁可分为三类

1、表锁        2、元数据锁        3、意向锁

1.表锁 

表锁分为两类

1.表共享读锁

2.表独占写锁

读锁(read):只能读,不能写

写锁(write):既能读,也能写

具体用法:

加锁

        lock table 表名(可以是多张表) read/write

解锁

        unlock tables 或 直接断开客户端连接(关闭客户端)

2.元数据锁 

元数据:简单理解为表结构

元数据实际上是系统自动控制的,不需要显示使用,当我们访问一张表的时候会自动加锁,主要作用就是维护表结构的数据一致性,当表中有活动事务存在时,是不允许操作元数据写入的

也就是如果有一张表有存在未提交的事务,不允许修改表结构,其目的就是为了避免DML与DDL冲突

元数据锁是系统自带的锁,只需了解

3.表锁:意向锁

意向锁是为了避免DML执行时,行锁与表锁的冲突,可以让表锁无需检查每行数据是否加锁,直接使用意向锁减少表锁的检查

意向锁判断依据是是否兼容,如果是可兼容的锁就可以直接加上,如果是排他锁则被阻塞,知道行锁释放

意向锁的作用:通过意向锁省略时间,不需要一行一行进行判断,可以直接判断意向锁是排他锁还是兼容锁 

意向锁的使用

意向锁分为两种类型:

        1.意向共享锁:select ...... lock in share mode 添加,与表共享锁(read)兼容,与表锁排他锁(write)互斥

        2.意向排他锁:insert、delete、select... for update添加,与表锁共享锁(read)及排他锁(write)都互斥,意向锁之间不会互斥

事务一旦提交,意向共享锁,意向排他锁,都会自动释放

查看意向锁及行锁加锁情况:

 行级锁

行锁也称为记录锁,锁住某一行,MySQL服务器层没有实行行锁机制,行级锁只在储存引擎实现

优点:锁的力度小,发生锁冲突概率低,可以实现高并发

缺点:对于锁的开销比较大,加锁会比较慢

1.行级锁的分类

1.行锁(记录锁):记录锁就是仅仅把一条记录锁上,仅仅锁住一条记录,对其他数据没有影响,防止其他事务对这条数据进行修改或删除操作

2.间歇锁:锁定索引记录间隙(不含该记录),确保索引记录间隙不变,防止其他事务在这个间隙进行insert插入操作,产生幻读,实际上这也是MySQL隔离级别 可重复读 隔离级别下,解决幻读的一种方案

3.临键锁:既想锁住某条记录,又想阻止其他事务在该记录前边的间隙插入新纪录,就是行锁和间隙锁组合,innodb默认采用临键锁

2. 行锁/记录锁

行锁的类型

在InnoDB引擎中实现了两种类型的行锁

        1.共享锁(s):允许一个事务读取一行,阻止其他事务获得相同数据的排它锁,简单理解就是共享锁和共享锁兼容和排它锁排斥

        2.排它锁(x):允许获取排它锁的事务更新数据,阻止其他事务获取相同的排它锁和共享锁

 

 锁模式兼容性

行级锁定实现方式——必定通过索引实现

 常见SQL语句执行时的加锁情况

行锁只能锁定当前行所在的一条数据,其他数据不被锁住 

行锁只有索引存在时才会生效,否则会生成表锁

间歇锁/临键锁

间隙锁:锁定索引记录间隙(不含该记录),确保索引记录间隙不变,防止其他事务在这个间隙进行insert,产生幻读

临键锁:既想锁定某条记录,又想阻止其他事务在该记录前边的间隙插入新记录,就是行锁和间隙锁组合,InnoDB默认的是临键锁

唯一索引等值查询 

当查询的记录是存在的,next-key lock 会退化成 当前记录的「记录锁」。 当查询的记录是不存在的,next-key lock 会退化成 当前记录所在区间的「间隙锁」。 

commit提交以后锁释放

非唯一索引等值查询(尽量避免) 

当查询的记录存在时,除了会加 next-key lock 外,还额外对下一区间加「间隙锁」。 首先先来给age字段添加普通索引

唯一索引范围查询 

对于给定范围中涉及到的值都加next-key lock,会访问到不满足条件的第一个值为止。 直接查询一个范围,并且添加共享锁,来查看 

加锁规则: 

1. 唯一索引等值查询: 当查询的记录是存在的,next-key lock 会退化成 当前记录的「记录锁」。 当查询的记录是不存在的,next-key lock 会退化成 当前记录所在区间的「间隙锁」。 2. 非唯一索引等值查询(不建议使用): 当查询的记录存在时,除了会加 next-key lock 外,还额外对上下区间加「间隙锁」。 3. 唯一索引范围查询: 对于给定范围中涉及到的值都加next-key lock,会访问到不满足条件的第一个值为 止。 

锁总结

什么是MySQL锁:

在并发访问时,解决数据一致性、有效性问题的解决方案,MySQL中的 锁是在服务器层或者存储引擎层实现的,我们所讲的所有锁的内容都是应用在InnoDB引擎 中的。

锁分为三种:全局锁、表级锁、行级锁

全局锁:对整个数据库实例加锁,粒度最大,加锁后整个数据库实例处于只读状态,性能较 差,一般用于数据库逻辑备份使用

表级锁:锁住整张操作的表,粒度也比较大,发生锁冲突概率比较高,具体分为:表锁(具 体分为读和写两种锁)、元数据锁(主要作用就是针对DML语句和DDL语句的冲突)、意向 锁(主要目的规避行锁与表锁的冲突问题,避免表锁再加锁时逐行扫描行锁,自动无需手动 操作)

行级锁:锁住对应操作表的具体行数据(针对索引),粒度最小,发生锁冲突的概率最小, 具体分为:行锁、间隙所、临键锁,要注意的是其中共享锁与共享锁是可以兼容的,但是与 排它锁,包括排它锁与排它锁之间都是互斥的 

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

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

相关文章

SpringBoot 自动装配原理---源码详解

目录 SpringBoot 自动装配原理源码流程详解:流程总结:条件匹配解释:其他解释: SpringBoot 自动装配原理 源码流程详解: 1、先看启动类,启动这个main方法,然后调用这个run方法。 2、把 启动类作…

南京邮电大学数据库实验二

1. 用create database命令创建电影数据库(MovieDB)。 create database MovieDB; 在创建表之前需调用一下指定的数据库: use MovieDB; 2.在电影数据库中用create table 命令创建如下5个关系模式: 创建movies表: create table Movies( ti…

城市货车通行码二维码解析

目录 说明 界面 下载 城市货车通行码二维码解析 说明 二维码扫描信息为: tmri://12123?ywlx1041&ewmeyJ0eHpiaCI6IjUxMDcwMDAwMDE0MyIsInR4em1jIjoiQeivgSIsImhwemwiOiIwMiIsImhwaG0iOiLlt51CMkwzMjYiLCJrc3JxIjoiMjAyMS0xMS0yOCIsImpzcnEiOiIyMDIyLTEyL…

虚幻学习笔记12—C++类的实例化

一、前言 本系列如无特殊说明使用的虚幻版本都是5.2.1,VS为2022版本。在Unity中通常创建的脚本都默认继承了MonoBehavior,都是不能再用代码New而实例化的,虚幻也是一样不能直接New来实例化。在Unity中是通过Instantiate方法来实例化一个游戏对…

C++ lambda表达式

写法格式 lambda表达式的写法格式如下: [capture-list] (parameters) mutable -> ret { statement } 各部分的说明为:[capture-list] : 捕获列表,编译器根据[]来判断接下来的代码是否为lambda函数,捕捉列表能够捕捉上下文中…

【ArcGIS Pro微课1000例】0055:Pro中如何处理个人数据库(.mdb)

文章目录 原因分析解决方案使用ArcGIS Pro的用户应该已经发现个人地理数据库(.mdb)不能使用了。随着ESRI的软件技术革新,在ArcGIS Pro中不再支持且将来也不会支持个人地理数据库(.mdb)。这个确实很烦人,很多项目还是在使用mdb数据库的。不过ESRI也给出了一些解决办法,不…

二叉搜索树的简单C++类实现

二叉搜索树(BST)是一种重要的数据结构,它对于理解树的操作和算法至关重要。本文将通过一个C示例来展示如何实现一个BST,并在插入和删除节点时提供清晰的输出,以帮助可视化这些操作的过程。 二叉搜索树的节点结构 首先…

Elasticsearch 8.9 search命令执行查询源码

一、相关的API的handler1、接收HTTP请求的handler2、往数据节点发送查询请求的action(TransportSearchAction)3、通过transportService把查询请求发送到指定的数据节点 二、数据节点收到请求的处理逻辑1、尝试从缓存中加载查询结果2、不通过缓存查询,直接执行查询(1…

Elasitcsearch--解决CPU使用率升高

原文网址:Elasitcsearch--解决CPU使用率升高_IT利刃出鞘的博客-CSDN博客 简介 本文介绍如何解决ES导致的CPU使用率升高的问题。 问题描述 线上环境 Elasticsearch CPU 使用率飙升常见问题如下: Elasticsearch 使用线程池来管理并发操作的 CPU 资源。…

智慧农业大数据可视化UI,数据展示平台(免费可视化大屏模版PS资料)

大屏幕展示方式可以实现信息的直观呈现与交互操作,使农业生产者能够一目了然地掌握有关农情、天气、土壤等数据信息,从而科学决策。智慧农业大数据可视化大屏是提升农业生产效益的一种重要工具。 现分享亩产效益指标、农业大数据可视化、农业数据展示平…

QEMU源码全解析 —— virtio(11)

接前一篇文章: 上一回对于virtio_balloon_pci_realize函数进行了详细解析。最后讲到在virtio_balloon_pci_realize函数的最后一步调用了object_property_set函数,从而导致了virtio_device_realize函数的执行。本回就来对于virtio_device_realize函数进行…

Flutter工具安装与环境搭建

1、下载 Flutter SDK,下载完成后,在需要放置SDK的地方解压即可。 注意: 请勿将 Flutter 有特殊字符或空格的路径下。请勿将 Flutter 安装在需要高权限的文件夹内,例如 C:\Program Files\。 2、配置环境变量 例如: …

NO-IOT翻频,什么是翻频,电信为什么翻频

1.1 翻频迁移最终的目的就是减少网络的相互干扰,提供使用质量. 1.2 随着与日俱增的网络规模的扩大,网内干扰已成了影响网络的质量标准之一,为了保障电信上网体验,满足用户日益增长的网速需求,更好的服务客户,电信针对…

【迅搜09】索引管理(二)增删改操作

索引管理(二)增删改操作 今天我们来学习真正的,最核心的索引管理相关的操作。但其实今天的内容还更简单一些,为啥呢?因为索引管理中,最核心的就是对于数据的增、删、改呀。其实要往大了说,查询也…

缓存的定义及重要知识点

文章目录 缓存的意义缓存的定义缓存原理缓存的基本思想缓存的优势缓存的代价 缓存的重要知识点 缓存的意义 在互联网高访问量的前提下,缓存的使用,是提升系统性能、改善用户体验的唯一解决之道。 缓存的定义 缓存最初的含义,是指用于加速 …

宝塔PostgreSQL设置数据库远程访问

宝塔PostgreSQL设置数据库远程访问 宝塔的PostgreSQL1. 添加数据库2. 打开PostgreSQL设置界面3. 修改配置4. 重载配置/重启数据库 Docker的PostgreSQL1. postgresql.conf2. pg_hba.conf3. 重启数据库 注意其他问题 宝塔PostgreSQL设置数据库远程访问?docker容器Post…

CleanMyMac X2024(Mac优化清理工具)v4.14.5中文版

CleanMyMac X是一款颇受欢迎的专业清理软件,拥有十多项强大的功能,可以进行系统清理、清空废纸篓、清除大旧型文件、程序卸载、除恶意软件、系统维护等等,并且这款清理软件操作简易,非常好上手,特别适用于那些刚入手苹…

《每天一个Linux命令》 -- (15) mkdir命令

欢迎阅读《每天一个Linux命令》系列 !在本篇文章中,将说明mkdir命令用法。 概念 mkdir命令是Linux系统下的目录创建命令,用于创建指定的目录。 英文原意:make directories,所在路径:/bin/mkdir&#xff0…

【AI】YOLO学习笔记

作为经典的图像识别网络模型,学习YOLO的过程也是了解图像识别的发展过程,对于初学者来说,也可以了解所采用算法的来龙去脉,构建解决问题的思路。 1.YOLO V1 论文地址:https://arxiv.org/abs/1506.02640 YOLO&#x…

软件设计师——计算机网络(三)

📑前言 本文主要是【计算机网络】——软件设计师——计算机网络的文章,如果有什么需要改进的地方还请大佬指出⛺️ 🎬作者简介:大家好,我是听风与他🥇 ☁️博客首页:CSDN主页听风与他 &#x1…