mysql进阶-锁
锁
概述
锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源(CPU、RAM、I/O)的争用以外,数据也是一种供许多用户共享的资源。
如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。
从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。
锁的一般应用场合:
简单事务控制:在些简单的事务控制场景下。
如:在单个数据库事务中需要确保某些数据的完整性和一致性时,可以直接在SQL中增加排他锁来实现。这样做既简单又直接,避免引入额外的复杂性。
低并发情况:业务场景下并发访问量不高或不需要跨服务或跨实例进行加锁操作,直接在SQL中增加排他锁可能会更加轻量和直观,不需要引入额外的分布式系统组件。
数据库专用功能:有些数据库系统提供了特定的排他锁机制,并且对于特定的业务场景,这些数据库专用的排他锁功能可能更加适用和高效。
特定的数据操作:在某些需要对整个表或某些数据范围进行原子操作的情况下,直接在SQL中增加排他锁可能更加方便和可行,特别是针对较小规模的数据操作。
MySQL中的锁,按照锁的粒度分,分为以下三类:
1.全局锁:锁定数据库中的所有表。()
2.表级锁:每次操作锁住整张表。
3.行级锁:每次操作锁住对应的行数据。
全局锁
全局锁就是对整个数据库实例加锁,加锁后整个实例就处于只读状态。更新操作的事务提交语句都将被阻塞。
其典型的使用场景是做全库的逻辑备份,对所有的表进行锁定,从而获取一致性视图,保证数据的完整性。
备份数据库操作:
flush tables with read lock;//全局锁-只能读不能写
mysqldump -uroot -p1234 数据库名 >itcast.sql//执行数据备份
mysqldump -h ip -uroot p1234 db01 >D:/db01.sql//远程备份
unlock tables;//解锁
弊端-数据库中加全局锁是一个比较重的操作,存在以下问题:
如果在主库上备份,那么在备份期间都不能执行更新,业务基本上就得停摆。
如果在从库上备份,那么在备份期间从库不能执行主库同步过来的二进制日志(binlog),会导致主从延迟。
上述问题将在运维篇深入讲解
在InnoDB引擎中,我们可以在备份时加上参数 --single-transaction 参数来完成不加锁的一致性数据备份。
mysqldump --single-transaction -uroot -p123456 itcast>itcast.sql
表级锁
表级锁在操作时会锁住整张表。锁定粒度大,发生锁冲突的概率最高,并发度最低。在MISAM、InnoDB、BDB等存储引擎中都支持。
对于表级锁,主要分为:表锁、元数据锁(meta data lock,MDL)、意向锁
- 表锁
表锁的分类:
1.表共享读锁(read lock)-所有用户都只能读不能写
2.表独占写锁(write lock)-仅当前用户能读能写,其他用户不能读不能写
语法:
lock tables 表名 read/write;//加锁
unlock tables;或让客户端断开连接//释放锁
- 元数据锁
元数据的定义:
元数据是描述数据的数据,具体到MySQL中,它描述了数据库的结构和意义,包括数据库、表、列、索引等对象的信息。
元数据锁的介绍:
MDL加锁过程是系统自动控制,无需显式使用,在访问一张表的时候会自动加上。
MDL锁主要作用是维护表元数据的数据一致性,在表上有活动事务的时候,不可以对元数据进行写入操作。为了避免DML与DDL冲突,保证读写的正确性。
在MySQL5.5中引入了MDL,当对一张表进行增删改查的时候,加MDL读锁(共享);当对表结构进行变更操作的时候,加MDL写锁(排他)。
| SQL | 锁类型 | 说明 |
|---|---|---|
| lock tables xxx read/write | SHARED READ ONLY/SHARED NO READWRITE | |
| select 、 select ... lock in share mode | SHARED READ-元数据读锁 | 与SHARED READ、SHARED WRITE兼容,与EXCLUSIVE互斥 |
| insert 、update、delete、select ... for update | SHARED WRITE-元数据写锁 | 与SHARED READ、SHARED WRITE兼容,与EXCLUSIVE互斥 |
| alter table ... | EXCLUSIVE-排他锁 | 与其他的MDL都互斥 |
select object type,object schema,object name,lock type,lock duration from performance_schema.metadata_locks;//查看元数据锁
- 意向锁
为了避免行锁与表锁的冲突,在InnoDB中引入了意向锁。
使得表锁不用检查每行数据是否加锁,使用意向锁来减少表锁的检查。
意向锁分类:
1、意向共享锁(IS)添加: lock in share mode
通过A窗口先开启事务
begin;
加行锁的同时对表添加意向共享锁。
select * from score where id=1 lock in share mode。//与表锁共享锁(read)兼容,与表锁排它锁(write)互斥
开启B Mysql窗口进行验证
lock tables score read;//验证-对表加共享读锁==》成功
lock tables score write;//验证-对表加独占写锁==》阻塞
总结
A窗口对score表加了意向共享锁并给id为1的行加了共享行锁。
此时可以对score表加共享读锁但不能加写锁。因为**意向共享锁和读锁是兼容的**
2、意向排他锁(IX)添加: insert、update、delete、select ... for update
通过A窗口先开启事务
begin;
为更新语句增加意向排他锁
update score set math=66 where id = 1;
开启B窗口进行验证
lock tables score read;//验证-对表加共享读锁==》阻塞
lock tables score write;//验证-对表加独占写锁==》阻塞
3、查看意向锁及行锁的加锁情况:
select object_schema,object_name,index_name,lock_type,lock_mode,lock_data from performance_schema.data_locks;
行级锁
介绍:
行级锁,每次操作锁住对应的行数据。锁定粒度最小,发生锁冲突的概率最低,并发度最高。应用在InnoDB存储引擎中。
InnoDB的数据是基于索引组织的,行锁是通过对索引上的索引项加锁来实现的,而不是对记录加的锁。
对于行级锁,主要分为以下三类:
1.行锁(Record Lock):锁定单个行记录的锁,防止其他事务对此行进行update和delete。在RC、RR隔离级别下都支持。
2.间隙锁(GapLock):锁定索引记录间隙(不含该记录),确保索引记录间除不变,防止其他事务在这个间隙进行insent,产生幻读。在RR隔离级别下都支持。
3.临键锁(Next-KeyLock):行锁和间隙锁组合,同时锁住数据,并锁住数据前面的间隙Gap。在RR隔离级别下支持。
- 行锁
InnoDB实现了以下两种类型的行锁:
共享锁(S):允许一个事务去读一行,阻止其他事务获得相同数据集的它锁。
排他锁(X):允许获取排他锁的事务更新数据,阻止其他事务获得相同数据集的共享锁和排他锁。
| (S)共享锁 | (X)排他锁 | |
|---|---|---|
| (S)共享锁 | 兼容 | 冲突 |
| (X)排他锁 | 冲突 | 冲突 |
常见增删改查对应锁情况:
| SQL | 行锁类型 | 说明 |
|---|---|---|
| INSERT | 排他锁 | 自动加锁 |
| UPDATE | 排他锁 | 自动加锁 |
| DELETE | 排他锁 | 自动加锁 |
| SELECT(正常) | 不加锁 | |
| SELECT ... LOCKIN SHARE MODE | 共享锁 | 需要手动在SELECT之后加LOCK IN SHARE MODE |
| SELECT ... FOR UPDATE | 排他锁 | 需要手动在SELECT之后加FOR UPDATE |
默认情况下,InnoDB在REPEATABLE READ(默认)事务隔离级别运行,InnoDB使用next-key锁进行搜索和索引扫描以防止幻读。
1.针对唯一索引进行检索时,对已存在的记录进行等值匹配时,将会自动优化为行锁。
2.InnoDB的行锁是针对于索引加的锁,如果不通过索引条件检索数据那么InnoDB将对表中的所有记录加锁,此时就会升级为表锁。(常见优化问题-重要)
- 间隙锁/临键锁
默认情况下,InnoDB在REPEATABLE READ事务隔离级别运行,InnoDB使用next-key锁(临建锁)进行搜索和索引扫描以防止幻读。
1.索引上的等值查询(唯一索引),给不存在的记录加锁时,优化为间隙锁。
2.索引上的等值查询(普通索引),向右遍历时最后一个值不满足查询需求时,next-key lock 退化为间隙锁。
3.索引上的范围查询(唯一索引)--会访问到不满足条件的第一个值为止。
mysql进阶-锁的更多相关文章
- (6)MySQL进阶篇SQL优化(MyISAM表锁)
1.MySQL锁概述 锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的计算资源 (如 CPU.RAM.I/O 等)的抢占以外,数据也是一种供许多用户共享的资源.如何保证数 据并 ...
- MYSQL进阶学习笔记八:MySQL MyISAM的表锁!(视频序号:进阶_18-20)
知识点九:MySQL MyISAM表锁(共享读锁)(18) 为什么会有锁: 打个比方,我们到淘宝买一件商品,商品只有一件库存,这时候如果还有另外一个人也在买,那么如何解决是你买到还是另一个人买到的问题 ...
- 【目录】mysql 进阶篇系列
随笔分类 - mysql 进阶篇系列 mysql 开发进阶篇系列 55 权限与安全(安全事项 ) 摘要: 一. 操作系统层面安全 对于数据库来说,安全很重要,本章将从操作系统和数据库两个层面对mysq ...
- MySQL进阶篇(02):索引体系划分,B-Tree结构说明
本文源码:GitHub·点这里 || GitEE·点这里 一.索引简介 1.基本概念 首先要明确索引是什么:索引是一种数据结构,数据结构是计算机存储.组织数据的方式,是指相互之间存在一种或多种特定关系 ...
- MySQL进阶篇(03):合理的使用索引结构和查询
本文源码:GitHub·点这里 || GitEE·点这里 一.高性能索引 1.查询性能问题 在MySQL使用的过程中,所谓的性能问题,在大部分的场景下都是指查询的性能,导致查询缓慢的根本原因是数据量的 ...
- MYSQL进阶学习笔记
MySQL在Linux中的使用: 1.查看mysql在linux的安装版本 mysqladmin –version 2.mysql服务的启动与停止 (1).启动: service mysql star ...
- mysql乐观锁总结和实践--转
原文地址:http://chenzhou123520.iteye.com/blog/1863407 上一篇文章<MySQL悲观锁总结和实践>谈到了MySQL悲观锁,但是悲观锁并不是适用于任 ...
- 【MySQL】锁入门
要做的完全掌握MySQL/InnoDB的加锁规则,甚至是其他任何数据库的加锁规则,需要具备以下的一些知识点 了解数据库的一些基本理论知识:数据的存储格式 (堆组织表 vs 聚簇索引表):并发控制协议 ...
- mysql行锁和表锁
mysql innodb支持行锁和表锁,但是MyIsam只支持表锁.现在我们说说mysql innodb的行锁和 有如下表id为主键 为了出现演示效果,我们将mysql的autocommit设置为0 ...
- MYSQL的锁介绍,以及死锁发生情况-带例子
mysql锁能在并发情况下的mysql进行更好的优化 MySQL有三种锁的级别:页级.表级.行级,这3种锁的特性可大致归纳如下: 表级锁:开销小,加锁快:不会出现死锁:锁定粒度大,发生锁冲突的概率最高 ...
随机推荐
- pygame游戏:python版本的贪吃蛇游戏 —— Python 贪吃蛇魔改大赛
在网上找python版本的贪吃蛇游戏,看到一个Gitee Community / Python 贪吃蛇魔改大赛,感觉还不错,这里收藏下. 一等奖 1名 Snake Quest 蛇蛇闯关: jeffya ...
- BOM 相关知识总结
一:介绍BOM 1 1.什么是BOM? 2 DOM就是一套操作HTML标签的API(接口/方法/属性) 3 BOM就是一套操作浏览器的API(接口/方法/属性) 4 5 2.BOM中常见的对象 6 w ...
- 【A GUIDE TO CRC ERROR DETECTION ALGORITHM】 (译文2)
6. A Fully Worked Example 一个完全可行的例子 Having defined CRC arithmetic, we can now frame a CRC calculatio ...
- 自己实现一个自动检测网卡状态,并设置ip地址,源码见文章底部
阅读本文前,请先学习下面几篇文章 <搞懂进程组.会话.控制终端关系,才能明白守护进程干嘛的?> <简简单单教你如何用C语言列举当前所有网口!> <Linux下C语言操作网 ...
- QTreeWidget折叠子项(折叠当前项的所有子项)
QTreeWidget折叠子项(折叠当前项的所有子项) 本文仅供本人知识总结使用,所以内容会比较浅显,不喜勿喷. 文章目录 QTreeWidget折叠子项(折叠当前项的所有子项) 一.仅折叠子项 二. ...
- Clobotics 计算机视觉场景存储实践:多云架构、 POSIX 全兼容、低运维的统一存储
Clobotics 是一家将计算机视觉和机器学习技术应用于风电以及零售行业的企业.在风电行业,Clobotics 利用无人机对风力发电机叶片进行检查,显著降低了对人工作业的依赖.在零售领域,公司通过分 ...
- mybatis-plus批量增加、批量修改样例+建表语句+postman接口
使用mybatis-plus开发中会遇到数据量多的情况下,插入和修改效率低,主要原因是"新增"和"修改"方法是对一条数据进行处理的,如果有一万条数据就会和数据库 ...
- vuejs怎样封装一个插件(以封装vue-toast为例扩展)
插件介绍 插件通常会为 Vue 添加全局功能.插件的范围没有限制--一般有下面几种: 1.添加全局方法或者属性,如: vue-custom-element 2.添加全局资源:指令/过滤器/过渡等,如 ...
- webpack笔记-webpack之模块module、路径解析、resolve 配置(三)
module webpack 的初衷是让 js 支持模块化管理,并且将前端中的各种资源都纳入到对应的模块管理中来,所以在 webpack 的设计中,最重要的部分就是管理模块和模块之间的关系. 在 we ...
- 深度学习/NLP中的Attention注意力机制
首先是整体认知,Attention的位置: 传送门1:Attention 机制 传送门2:Attention用于NLP的一些小结 一句话概括:Attention就是从关注全局到关注重点. 借鉴了人类视 ...