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种锁的特性可大致归纳如下: 表级锁:开销小,加锁快:不会出现死锁:锁定粒度大,发生锁冲突的概率最高 ...
随机推荐
- 最快视频转绘-AnimateDiff-Lightning
最快视频转绘-AnimateDiff-Lightning Video-to-Video Generation AnimateDiff-Lightning 非常适合视频到视频的生成.使用 Control ...
- 华为超算平台git、cmake、wget、curl报错:SSLv3_client_method version OPENSSL_1_1_0 not defined in file libssl.so.1.1 with link time reference——解决方法
最近在使用超算平台时报错,不管是git.cmake.wget.curl中的哪个都报错,大致错误: /usr/bin/cmake3: relocation error: /usr/lib64/libcu ...
- 再探 游戏 《 2048 》 —— AI方法—— 缘起、缘灭(6) —— Python版本实现的《2048》游戏环境运行性能对比
<2048>游戏在线试玩地址: https://play2048.co/ 如何解决<2048>游戏源于外网的一个讨论帖子,而这个帖子则是讨论如何解决该游戏的最早开始,可谓是&q ...
- MFC中CString转int,double
CString str=L"123"; int n=_wtoi(str); //n=123 double d=_wtof(str); //d=123.0000 Vs2012中编译
- Python正则表达式提取车牌号
在Python中使用正则表达式(Regular Expressions)来提取车牌号是一个常见的任务,尤其是在处理车辆信息或进行图像识别后的文本处理时.中国的车牌号格式多种多样,但通常包含省份简称.英 ...
- IE中在线预览PDF文件
今天在项目中偶然遇到一个需要在线查看pdf的需求.在查阅一些资料之后使用了最简单的写法(需要在客户端安装AdbeRdr11000_zh_CN_11.0.0.379.exe软件). 还有其他方法可以实现 ...
- Ubuntu 安装基于 DEB 的 Firefox
自从 Canonical 推出了 Snap 之后,在所有新推出的 Ubuntu 发行版中都预装了 Snap 版的 Firefox,并将 APT 中的 Firefox 包指向了 Snap 的 Firef ...
- 关于java连接数据库时提示异常java.sql.SQLException: No suitable driver found for说明
当我们测试一个新的数据库服务时,需要使用对方提供jdbc驱动来连接数据库,有时候简单的写个demo去连接,发现提示异常: java.sql.SQLException: No suitable driv ...
- WebShell流量特征检测_蚁剑篇
80后用菜刀,90后用蚁剑,95后用冰蝎和哥斯拉,以phpshell连接为例,本文主要是对这四款经典的webshell管理工具进行流量分析和检测. 什么是一句话木马? 1.定义 顾名思义就是执行恶意指 ...
- SQL SEVER CDC 启动和关闭 操作说明
什么是变更数据捕获 (CDC)? 变更数据捕获使用 SQL Server 代理记录表中发生的插入.更新及删除. 因此,它使得可以通过关系格式轻松使用这些数据更改. 将为修改的行捕获将这些更改数据应用到 ...