mysql-锁

文章目录

  • 概念
  • 隔离级别
      • 未提交读(READ UNCOMMITTED)
      • 提交读(READ COMMITTED)
      • 可重复读(REPEATABLE READ)
      • 可串行化(SERIALIZABLE)
  • 锁分类
    • 按性能
      • 乐观锁(用版本对比来实现)
      • 悲观锁
    • 按照锁定机制
      • 全局锁
      • 表锁
        • 读S/写X锁——悲观锁
        • 元数据锁(meta data lock, MDL)
        • 意向锁(Intention Locks)(InnoDB)
        • 自增锁(AUTO-INC LOCKS)
      • 行锁
        • 记录锁(Record Locks)
        • 间隙锁(Gap Locks)
        • 临键锁(Next-Key Locks)
        • 插入意向锁(Insert Intention Locks)
    • 按照功能
      • 共享锁Shared Locks(S锁)
      • 排他锁Exclusive Locks(X锁)
    • 死锁
      • 产生死锁的情况
      • 解决死锁
    • 锁优化建议
  • mysqldump数据库备份
    • 支持事务引擎(innodb)
    • 不支持事务引擎(MyISAM)——全局锁

概念

计算机协调多个进程或线程并发访问某一资源的机制
防止多事务并发造成数据不统一,避免脏写、脏读、不可重复读、幻读等问题

脏写:事务A和事物B同时改一行数据,最后的更新覆盖了其他事务所做的更新
脏读:事务A读取到了事务B已经修改但尚未提交的数据
不可重复读:事务A内部的相同查询语句在不同时刻读出的结果不一致,不符合隔离性
幻读:事务A读取到了事务B提交的新增数据,不符合隔离性

隔离级别

// 查看当前数据库的事务隔离级别
show variables like 'tx_isolation';
// 设置事务隔离级别
set tx_isolation = 'REPEATABLE-READ';

Mysql默认隔离级别为可重复读
在这里插入图片描述

未提交读(READ UNCOMMITTED)

事务B可以读到事务A未提交的数据

提交读(READ COMMITTED)

事务B可以读到事务A提交的数据

可重复读(REPEATABLE READ)

事务B连接之后,读到的一直是连接开始的数据
可重复读的隔离级别下使用了MVCC(multi-version concurrency control)机制,select操作不会更新版本号,是快照读(历史版本);insert、update和delete会更新版本号,是当前读(当前版本)。

可串行化(SERIALIZABLE)

事务A操作未提交,事务B查询将一直处于等待状态
并发性很低,开发中很少会用到

锁分类

按性能

乐观锁(用版本对比来实现)

悲观锁

按照锁定机制

全局锁

作用范围:库(database)
实现层:SQL layer层
影响:整个库处于只读状态,所有更新操作都将阻塞
使用场景:全库逻辑备份(会影响业务运行,正常业务数据无法写入,无法同步,不推荐)

// 加锁
flush tables with read lock;
// 释放锁,或者断开事务连接,自动释放全局锁
unlock tables;

表锁

作用范围:表
实现层:SQL layer层
优点:开销小、加锁快,不会出现死锁
缺点:锁定粒度大,发生锁冲突的概率最高,并发度最低
场景:一般用在整表数据迁移

读S/写X锁——悲观锁

查看表锁状态变量

show status like 'table%';
- table_locks_immediate:产生表级锁定的次数;
- table_locks_waited:出现表级锁定争用而发生等待的次数

在这里插入图片描述
表锁两种表现形式:表共享读锁(Table Read Lock)、表独占写锁(Table Write Lock)

// 手动增加表锁
lock table tblname read(write);
// 查看表锁情况
show open tables;
// 删除表锁
unlock tables;

读锁影响:
1、自身和其他事务都能读
2、自身无法读取其他表,其他事务可以
3、自身写入或更新表会报错,其他事务将处于等待状态
写锁影响:
自身查询和写入都没问题,其他事务处于等待状态

元数据锁(meta data lock, MDL)

不需要显示使用,访问一个表的时候会自动加上,保证读写的正确性
增删改查操作加MDL读锁,表结构变更操作加MDL写锁
读锁之间不互斥
读写、写写之间互斥

意向锁(Intention Locks)(InnoDB)

mysql内部使用,不需要用户干预
意向锁和行锁可以共存
作用:为了全表更新数据时的性能提升,协调行锁与表锁的关系,判断表中有没有行锁

自增锁(AUTO-INC LOCKS)

涉及AUTO_INCREMENT列的事务性插入操作时产生

行锁

作用范围:某行 或者 行之间的间隙
实现层:存储引擎
InnoDB行锁:通过给索引上的索引项加锁来实现的,只有通过索引条件检索的数据才能使用,其他将使用表锁
优点:锁定粒度最小,发生锁冲突的概率最低,并发度最高
缺点:开销大、加锁慢、会出现死锁

// 查看行锁争夺情况
show status like 'innodb_row_lock%';
Innodb_row_lock_current_waits: 当前正在等待锁定的数量
Innodb_row_lock_time: 从系统启动到现在锁定总时间长度(等待总时长)
Innodb_row_lock_time_avg: 每次等待所花平均时间(等待平均时长)
Innodb_row_lock_time_max:从系统启动到现在等待最长的一次所花时间
Innodb_row_lock_waits:系统启动后到现在总共等待的次数(等待总次数)

按照锁定范围划分:

记录锁(Record Locks)

锁定索引中一条记录,锁住的是索引,而不是记录本身

// 记录共享锁
select * from tblname where id = 1 lock in share mode;
// 记录排他锁
select * from tblname where id = 1 for update;
间隙锁(Gap Locks)

锁住一个索引区间(开区间,不包括双端端点)
要么锁住索引记录中间的值,要么锁住第一个索引记录前面的值或者最后一个索引记录后面的值。
作用:防止幻读,保证索引间不会被插入数据
在可重复读隔离级别下才会生效

select * from tblname where id > 4 for update;
临键锁(Next-Key Locks)

索引记录上的记录锁和在索引记录之前的间隙锁的组合(间隙锁+记录锁)(左开右闭区间)

插入意向锁(Insert Intention Locks)

做insert操作时添加的对记录id的锁。

按功能划分:

共享锁(S):允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁。
select * from tblname where ... lock in share mode;
排他锁(X):允许获得排他锁的事务更新数据,阻止其他事务取得相同数据集的共享读锁和排他写锁。
select * from tblname where ... for update;

按照功能

共享锁Shared Locks(S锁)

加了S锁的记录,允许其他事务再加S锁,不能再加X锁

select ... lock in share mode

排他锁Exclusive Locks(X锁)

加了X锁的记录,不允许其他事务再加锁

select ... for update

死锁

两个或多个事务在同一资源上相互占用,并请求锁定对方占用的资源。锁定之后,双方都需要等待对方释放锁,同时又持有对方需要的锁,则陷入死循环。

产生死锁的情况

1、多个事务试图以不同的顺序锁定资源
2、多个事务同时锁定同一个资源
和存储引擎相关

set tx_isolation='repeatable-read';
Session_1执行:select * from account where id=1 for update;
Session_2执行:select * from account where id=2 for update;
Session_1执行:select * from account where id=2 for update;
Session_2执行:select * from account where id=1 for update;

解决死锁

1、检测到死锁的循环依赖,立即返回一个错误
2、当查询的时间达到锁等待超时的设定后放弃锁请求(不好)
3、将持有最少行级排他锁的事务进行回滚

锁优化建议

  • 尽可能让所有数据检索都通过索引来完成,避免无索引行锁升级为表锁
  • 合理设计索引,尽量缩小锁的范围
  • 尽可能减少检索条件范围,避免间隙锁
  • 尽量控制事务大小,减少锁定资源量和时间长度,涉及事务加锁的sql尽量放在事务最后执行
  • 尽可能低级别事务隔离

mysqldump数据库备份

支持事务引擎(innodb)

使用–single-transaction参数,利用mvcc提供一致性视图
不会影响业务的正常运行

不支持事务引擎(MyISAM)——全局锁

使用–lock-all-tables参数

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python入门,数据容器的通用操作(len,max,min,sorted)

1.len统计容器内元素个数 2.max统计元素最大元素 3.min统计元素最小元素 4.容器的转化功能 list(容器)将给定容器转化为列表 字符串转列表将字符串内的每一个元素都取了出来作为列表的每一个元素 字典则只会取出它的key,value会消失 str&…

在线SM2密钥生成工具

在线SM2密钥生成工具 - BTool在线工具软件,为开发者提供方便。本工具为你提供便捷的SM2密钥生成功能。SM2是中国国家密码管理局颁布的中国商用公钥密码标准算法(一种非对称加密算法),SM2采用的是ECC 256位的一种椭圆曲线的加密算法,其密钥长度256bit&…

go中如何进行单元测试案例

一. 基础介绍 1. 创建测试文件 测试文件通常与要测试的代码文件位于同一个包中。测试文件的名称应该以 _test.go 结尾。例如,如果你要测试的文件是 math.go,那么测试文件可以命名为 math_test.go。 2. 编写测试函数 测试函数必须导入 testing 包。每…

HIve项目入门 环境部署遇到的问题及解决方案

环境布置的步骤建议是jdk, hadoop hive这几个分别去下载,参考以下几个安装教程: 【主要参考:傻瓜式教程】Windows下安装Hive MySQL版【附安装Hadoop教程】全网最详细的图文教程 【有一些补充的内容】:Windows下安装Hive 遇到的几个…

2024.1.16每日一题

LeetCode 2719.统计整数数目 2719. 统计整数数目 - 力扣(LeetCode) 题目描述 给你两个数字字符串 num1 和 num2 ,以及两个整数 max_sum 和 min_sum 。如果一个整数 x 满足以下条件,我们称它是一个好整数: num1 &l…

QT 原生布局和QML的区别

一、QML 与 Qt Quick的区别 1.1 从概念上区分 为了更精确地对两者进行说明,先看助手对 QML 的描述: QML is a user interface specification and programming language. QML 是一种用户界面规范和标记语言,允许开发人员和设计师创建高性能、流…

招生官怒批ChatGPT文书质量“缺少灵魂”

ChatGPT无疑是最近两年留学届的热门话题,也成为了不少留学生再也离不开的万能工具,从总结文献、润色论文、给教授写email似乎无所不能。甚至还有不少同学在考虑直接提交ChatGPT生成的文书。 那么ChatGPT生成的文书质量高吗?各大高校对于学生…

【NI国产替代】PXI-6254,32 AI(16位,1 MS/s),48 DIO,PXI多功能I/O模块

32 AI(16位,1 MS/s),48 DIO,PXI多功能I/O模块 PXI-6254提供模拟输入、关联数字I/O、两个32位计数器/定时器以及模拟和数字触发。该设备为从实验室自动化、研究、设计验证/测试到制造测试等各种应用提供了低成本的可靠D…

基于ssm的疫苗预约系统论文

摘 要 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装疫苗预约系统软件来发挥其高效地信息处理的作用&#xff0c…

Vue-API

$parent 和 $children $parent 父传子--在子组件中使用,放在计算属性、生命周期中: $children 子传父--方法中使用: $nextTick: $ref: 操作dom $set、$delete:

Docker-01-安装基础命令

Docker-01-安装&基础命令 文章目录 Docker-01-安装&基础命令一、Docker是什么?二、安装Docker①:卸载旧版②:配置Docker的yum库③:安装Docker④:启动和校验⑤:配置镜像加速01:注册阿里云…

第二证券:旅游股大涨 “预热”春节黄金周

在淄博烧烤热、哈尔滨冰雪热火爆出圈后,希望能接住文旅下一波“泼天富贵”的各地文旅局各出奇招并“卷”出新高度,被各地网友谈论“杀疯了”。 其间,A股游览概念股迎来一波集体上涨,成为不少出资者的重视热点,而行将到…

人机协同中存在一个独特的时空体系

一、在人机协同中存在一个独特的时空体系 在人机这个独特的时空体系中,人和机器之间的时间和空间的交织和共同作用。 在时间维度上,人机协同体系中的人和机器具有不同的时间节奏和速度。人类有限的生命周期和有时候需要休息的需求使得他们的工作时间和生…

Java 使用 EasyExcel 爬取数据

一、爬取数据的基本思路 分析要爬取数据的来源 1. 查找数据来源:浏览器按 F12 或右键单击“检查”打开开发者工具查看数据获取时的请求地址 2. 查看接口信息:复制请求地址直接到浏览器地址栏输入看能不能取到数据 3. 推荐安装插件:FeHelper&a…

Dockerfile: CMD与ENTRYPOINT区别

CMD和ENTRYPOINT的作用 CMD和ENTRYPOINT这两个命令,我接触到的是用在了Dockerfile中用于构建容器。 CMD:The main purpose of a CMD is to provide defaults for an executing container. CMD的主要用途是为正在执行的容器提供默认值。也就是指定这个容…

力扣hot100 多数元素 摩尔投票

Problem: 169. 多数元素 文章目录 思路解题方法复杂度💖 Code👨‍🏫 参考代码 思路 👨‍🏫 参考题解 👨‍🏫 参考图解 解题方法 描述你的解题方法 复杂度 时间复杂度: 添加时间复杂度, 示例…

成都爱尔谭娇解读眼睑松弛“提拉”要趁早,避免遮挡损害视力!

眼皮耷拉无力没法抬起,仿佛永远没睡醒。 怎么使力都没用眼睛就是睁不开, 甚至两只眼睛一大一小不对称, 这种时候要警惕一种病症“上睑下垂”! 早期上睑下垂症状并不明显,很容易被忽视,但眼睑下垂时间久了可能会对视力产…

ArcGIS Pro 拓扑编辑和常见一些拓扑错误处理

7.4 拓扑编辑 拓扑编辑也叫共享编辑,多个数据修改时,一块修改,如使用数据:chp7\拓扑检查.gdb,数据集DS下JZX、JZD和DK,加载地图框中,在“地图”选项卡下选择“地图拓扑”或“ds_Topology(地理数据库)”&…

23年全球数字经济发展如何?这本《白皮书》告诉你答案丨附下载

这一年,全球主要国家优化数字经济政策布局, 促进数字产业化创新升级、发展数字基础设施; 这一年,全域国际合作让“命运共同体” 构建见成效, 全球经济多极化趋势加强,中国坐拥Top1数字市场; …

Java NIO (一)简介

1 NIO简介 在1.4版本之前,Java NIO类库是阻塞IO,从1.4版本开始,引进了新的异步IO库,被称为Java New IO类库,简称为Java NIO。New IO类库的目的 就是要让Java支持非阻塞IO。 Java NIO类库包含三个核心组件: …