当前位置: 首页 > news >正文

MySQL--锁

锁是mysql在并发访问时,解决数据访问一致性、有效性的一种机制

mysq中的锁,按照锁的粒度分,分为以下三类:
全局锁:锁定数据库中的所有表
表级锁:每次操作锁住整张表
行级锁:每次操作锁住对应的行数据

全局锁

全局锁是对整个数据库实例加锁,加锁后整个实例处于只读状态。

使用场景

做全库的逻辑备份,对所有的表进行锁定,从而获取一致性视图,保证数据的完整性

备份数据(windwos命令)

mysqldump -hlocalhost -uroot -p123 数据建库名 >D:/文件名.sql

加锁(sql命令)

flush tables with read lock;

释放锁

unlocak tables;

特点

  1. 如果在主库上备份,那么在备份期间都不能执行更新,业务基本上就得停摆。
  2. 如果在从库上备份,那么在备份期间从库不能执行主库同步过来的二进制日志,会导致主从延迟。

表级锁

表锁
表锁分为两类:

  1. 表共享读锁(read lock)
  2. 表独占写锁(write lock)

语法

  1. 加锁:lock tables 表名 … read/wirte

  2. 释放锁:unlock tables /客户端断开连接

读锁不会阻塞其他客户端的读,但会阻塞写。写锁即会阻塞其他客户端的读,也会阻塞写。

元数据锁
MDL加锁过程是系统自动控制,无需显示使用,在访问一张表的时候会自动加上。MDL锁主要作用是维护表元数据的数据一致性,在表上有活动事务的时候,不可以对元素数据进行写入操作。为了避免DML和DDL冲突,保证读写的正确性。

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

对应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都互斥

意向锁
为了避免DML在执行时,加的行锁与表锁的冲突,在InnoDB中引入了意向锁,使得表锁不用检查每行数据是否加锁,使用意向锁来减少表锁的检查。
意向锁分为

  1. 意向共享锁(IS):与表锁共享锁(read)兼容,与表锁排他锁(write)互斥。
  2. 意向排他锁(IX):与表锁共享锁(read)及排它锁(write)都互斥。意向锁之间不会互斥。

可以通过查询下表获取事务中的锁

select object_schema,object_name,index_name,lock_type,lock_mode,lock_data from performance_schema.data_locks;

行级锁

每次操作锁住对应的行数。锁定力度最小,并发最大。
行锁
InnoDB实现了一下两种类型的行锁:

  1. 共享锁(S):允许一个事务去读一行,其他事务获得相同数据集的排他锁。
  2. 排他锁(X):允许获取排他锁的事务更新数据,组织其他事务获得相同数据集的共享锁和排他锁。
SQL行锁类型说明
insert排他锁自动加锁
update排他锁自动加锁
delete排他锁自动加锁
select不加任何锁
select … lock in share mode共享锁手动添加
select … for update排他锁手动添加
  1. 针对唯一索引进行检查时,对已存在的记录进行等值匹配时,将会自动优化为行锁。
  2. InnoDB的行锁是针对于索引加的锁,不通过索引条件检索数据,那么InnoDB将对表中的所有记录加锁,此时会升级会表锁

间隙锁/临建锁
默认情况下,InnoDB在REPEATABLE READ 事务隔离级别运行,InnoDB使用next-key锁进行搜索和索引扫描,以防止幻读。

  1. 索引上的等值查询(唯一索引),给不存在的记录加锁时,优化为间隙锁
  2. 索引上的等值查询(普通索引),向右遍历时最后一个值不满足查询需求时,next-key lock 退化为间隙锁
  3. 索引上的范围查询(唯一索引)会访问到不满足条件的第一个值为止

间隙锁的唯一目的是防止其他事务插入间隙。间隙锁可以共存,一个事务采用的间隙锁不会阻止另一个事务在同一间隙上采用间隙锁。

相关文章:

  • webpack 打包优化
  • 【深度学习】因果推断与机器学习的高级实践 | 数学建模
  • 前端管理制度
  • 区块链技术将如何影响未来的数字营销?
  • EfficientViT:高分辨率密集预测的多尺度线性注意
  • Oracle(2-6) Backup and Recovery Overview
  • 网络安全面试经历
  • 华为认证 | Security安全认证学什么?IA、IP、IE学习内容详解!
  • Spring第二课响应的完全,如何理解前后端互联
  • oracle的debjob挂載及查詢
  • CSS-鼠标属性篇
  • 一个简易计算器实现(c语言)
  • ddns-go部署在linux虚拟机
  • mysql数据库基础知识,Mysql的索引和主键区别,数据库的事务的基本特性
  • Selenium中常用的JS操作总结
  • 【译】理解JavaScript:new 关键字
  • 3.7、@ResponseBody 和 @RestController
  • angular2 简述
  • Cookie 在前端中的实践
  • ES6核心特性
  • Flannel解读
  • IIS 10 PHP CGI 设置 PHP_INI_SCAN_DIR
  • isset在php5.6-和php7.0+的一些差异
  • Linux下的乱码问题
  • nodejs实现webservice问题总结
  • spring + angular 实现导出excel
  • WinRAR存在严重的安全漏洞影响5亿用户
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 如何胜任知名企业的商业数据分析师?
  • 入门到放弃node系列之Hello Word篇
  • 移动端 h5开发相关内容总结(三)
  • MyCAT水平分库
  • 关于Android全面屏虚拟导航栏的适配总结
  • 函数计算新功能-----支持C#函数
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • ​【已解决】npm install​卡主不动的情况
  • # 达梦数据库知识点
  • (2)STM32单片机上位机
  • (9)STL算法之逆转旋转
  • (bean配置类的注解开发)学习Spring的第十三天
  • (k8s中)docker netty OOM问题记录
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (力扣)1314.矩阵区域和
  • (算法)Game
  • (源码版)2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • .NET Core 通过 Ef Core 操作 Mysql
  • .NET Standard 的管理策略
  • .NET/C# 解压 Zip 文件时出现异常:System.IO.InvalidDataException: 找不到中央目录结尾记录。
  • ?
  • @ResponseBody
  • [C#]DataTable常用操作总结【转】
  • [C#C++]类CLASS
  • [c++] 什么是平凡类型,标准布局类型,POD类型,聚合体
  • [C++随笔录] 红黑树