MySQL全局锁、表级锁、行级锁介绍演示(详细)
目录
介绍
分类
1、全局锁
1.1介绍
1.2场景
1.3语法
1.4演示
2、表级锁
2.1介绍
2.2分类
2.3语法
2.4演示
3、行级锁
3.1介绍
3.2分类
3.3场景
介绍
锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源(CPU、RAM、I/O)等争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。
分类
MySQL中的锁按照粒度可以分为以下三类:
1、全局锁:锁定数据库中所有表;
2、表级锁:每次操作锁住整张表;
3、行级锁:每次操作锁住对应的行数据;
1、全局锁
1.1介绍
全局锁就是对整个数据库实例加锁,加锁后整个数据库实例处于只读状态,提交的写入、更新、删除操作语句都会被阻塞。
最典型的使用场景就是做全库的逻辑备份,对所有的表进行锁定,从而获取一致性视图,保证数据的完整性。
1.2场景
假如数据库中有三张表,分别是商品库存表、订单表、订单记录表,如果对数据库直接进行备份,当商品库存表备份完成继续执行后续备份时,有客户下单会使三张表数据都进行改变,导致备份的商品库存表是该客户下单前的数据,订单表和订单记录表时该客户下单后的数据,此时备份完成的数据就不完整,不一致。
1.3语法
实现加全局锁进行逻辑备份主要分为以下步骤:
1、flush tables with read lock; 加全局锁;
2、mysqldump -u账户 -p密码 数据库名 > 备份sql文件路径 进行备份;
3、unlock tables; 释放全局锁;
1.4演示
连接数据库:我使用的本地数据库,如测试远程数据库可使用 mysql -h IP地址 -u 账号 -p 密码 连接;
加全局锁:所有数据库表全部锁住;
测试读写语句:此时数据库处于只读状态,更新、写入、删除语句都被不生效;
备份:因为该命令不是sql命令,所以需要退出mysql直接在命令窗口执行即可;
释放锁:
2、表级锁
2.1介绍
表级锁,每次操作锁住整张表,锁粒度最大,发生锁冲突的概率最高,并发最低,
2.2分类
对于表级锁,主要分为以下三类:
1.表锁;对于表锁可以分为两类:
1.1表共享读锁:加锁后只能读数据,不能更新、写入、删除数据,并且其他客户端访问也只能读数据,不能更新、写入、删除数据;
1.2表独占写锁:加锁后可以读、更新、写入、删除数据,但其他客户端访问不能读、更新、写入、删除数据;
2.元数据锁(MDL):元数据锁的加锁过程是系统自动控制的,无需显示使用,在访问一张表的时候会自动加上,元数据锁主要作用是维护表元数据的数据一致性,在表上有活动事务的时候,不可以对元数据进行写入操作。为了避免DDL与DML冲突,保证读写的正确性。
说明:元数据其实就是表的结构,元数据锁就是用来保证表结构的一致性,比如当某张表上有未提交的事务时,系统会自动加锁,该期间不能改变表的结构。
在MySQL5.5中引入了元数据锁,当对一张表进行增删改查的时候,自动加MDL读锁,当对表的结构进行变更操作的时候,自动加MDL写锁。
3.意向锁:为了避免DML语句执行时,加的行锁与表锁冲突,在InnoDB中引入了意向锁,使得表锁不用检查每行数据是否有行锁,使用意向锁来减少表锁的检查。意向锁可分为两类:
3.1意向共享锁(IS):与表锁共享读锁兼容,与表锁独占写锁互斥;
3.2意向排他锁(IX):与表锁共享读锁和表锁独占写锁都互斥;意向锁之间不会互斥;
说明:线程A开启事务,执行更新语句更新第五行数据,于是第五行数据会加上行锁,此时线程B进来准备对该表加表锁,线程B加表锁前会检查该表每行数据是否有行锁及类型,于是就会从第一行挨个检查,这个时候检查的效率就会极低。当引入了意向锁之后就会变成这样的情况,线程A开启事务,执行更新语句更新第五行数据,于是第五行数据会加上行锁同时对该表加上意向锁,此时线程B进来准备对该表加表锁,此时检查的是该表是否有意向锁而不是每行检查行锁,发现意向锁之后线程B被阻塞,知道线程A提交事务结束线程B继续执行任务。
2.3语法
表锁
加锁:lock tables 表名... read/write;
释放锁:unlock tables/客户端断开连接;
2.4演示
表共享读锁:客户端1进行加锁,加锁后客户端1只能读数据,不能操作数据,客户端2只能读数据,操作数据会被阻塞,直到客户端1释放锁,客户端2的操作数据语句才会继续执行;
表独占写锁:客户端1加锁后,可以进行读写数据操作,客户端2的读写操作都会被阻塞,直到客户端1将锁释放才会继续执行;
元数据库锁:在客户端1开始事务,执行查询语句且不提交事务,然后在客户端2中修改表结构会被阻塞,直到客户端1提交事务后,客户端2的修改表结构语句才会继续执行。
意向共享锁:select语句需手动加上 lock in share mode 才会加上行锁和意向共享锁;
意向排他锁:update、delete、insert语句执行时会自动加行锁和意向排他锁;
3、行级锁
3.1介绍
行级锁每次操作锁住对应的行数据,锁粒度最小,发生锁冲突的概率最低,并发度最高,主要应用在InnoDB存储引擎中。
3.2分类
InnoDB的数据是基于索引组织的,行锁是通过对索引上的索引项加锁来实现的,而不是对记录加的锁。行级锁主要分为以下三类:
1.行锁:锁定单个行记录的锁,防止其他事务对此进行update和delete,在RC、RR隔离级别下都支持;行锁分为以下两类:
1.1共享锁(S):允许一个事务去读一行,阻止其他事务获取相同数据的排他锁(共享锁与共享锁兼容,共享锁与排他锁互斥);
1.2排他锁(X):允许获取排他锁的事务更新数据,阻止其他事务获取相同数据的共享锁和排它锁(排他锁与共享锁互斥,排他锁与排他锁互斥);
2.间隙锁:锁定索引记录间隙,不包含记录,确保索引记录间隙不变,防止其他事务在这个间隙进行insert,在RR隔离级别下支持;
3.临键锁:行锁和间隙锁的组合,同时锁住数据和数据前面的所有间隙,在RR隔离级别下支持;
3.3场景
行锁
InnoDB的行锁是针对索引加的锁,当不通过索引条件操作数据时,那么InnoDB会将表中所有记录加锁,此时就会升级为表锁;
SQL | 行锁类型 | 说明 |
---|---|---|
INSERT... | 排他锁 | 自动加锁 |
UPDATE... | 排他锁 | 自动加锁 |
DELETE... | 排他锁 | 自动加锁 |
SELECT... | 不加任何锁 | |
SELECT... LOCK IN SHAR MODE | 共享锁 | 需手动在SELECT后加LOCK IN SHAR MODE |
SELECT... FOR UPDATE | 排他锁 | 需手动在SELECT后加FOR UPDATE |
MySQL全局锁、表级锁、行级锁介绍演示(详细)相关推荐
- CSS块级、行级、行级块标签、display、div、span
文章目录 块级标签 行级标签 行级块标签 display div 和span 块级标签 无论内容有多少,都会占据一行; 默认宽:与父级标签一致; 默认高:0 :或者与内容高度一致. 但是可以通过 wi ...
- MySQL锁的用法之行级锁
转:http://www.kubiji.cn/topic-id2510.html 行级锁是mysql中粒度最小的一种锁,他能大大减少数据库操作的冲突.但是粒度越小,实现的成本也越高.myisam引擎只 ...
- mysql行级锁升级_mysql innodb 行级锁升级
创建数据表test,表定义如下所示: CREATE TABLE `test` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) NO ...
- mysql 锁怎么使用_MySQL锁的用法之行级锁
行级锁是MySQL中粒度最小的一种锁,他能大大减少数据库操作的冲突.但是粒度越小,实现的成本也越高.MYISAM引擎只支持表级锁,而INNODB引擎能够支持行级锁,下面的内容也是针对INNODB行级锁 ...
- mysql锁表查询_Mysql upate 更新锁表还是锁行测试
mysql 学习 主题: -- 查询是否自动提交事务select @@autocommit;--关闭自动提交事务set autocommit = 0;--开启--执行--结束 事务start tran ...
- mysql查询数据会不会锁表_mysql select是否会锁表 ?
mysql select是否会锁表 ? 有的人说mysql的 select 会锁表 ,有的人说 mysql 的查询不会锁表 . 其他他们都对,没有 ,但是很片面. 其实对于mysql的select 是 ...
- mysql锁表 解锁_MYSQL 解锁与锁表和批解锁
解锁 第一种 show processlist; 找到锁进程,kill id ; 第二种 mysql>UNLOCK TABLES; 锁表 锁定数据表,避免在备份过程中,表被更新 mysql> ...
- mysql 改表名锁表_mysql修改字段防止锁表
步骤1: 修改一个大表的字段,add column或者drop column,操作后表会锁住,此时查询ok,insert和update会一直等待锁.如图. 解决方案: 1.基于要操作的表创建一个临时表 ...
- 在mysql中创建表的命令行_如何在命令行创建一个MySQL数据库
展开全部 第一步:安装MySQL客户端 当然你得确保MySQL客户端已经安装完毕.如果没有的话,可以按62616964757a686964616fe59b9ee7ad9431333339653663照 ...
- mysql条件删除表中某些行数据_根据MySQL中的条件仅删除表中的某些行
让我们首先创建一个表-create table DemoTable -> ( -> Id int, -> Name varchar(20) -> ); 使用insert命令在表 ...
最新文章
- 在SharePoint 2010使用OWA查看自己邮箱的内容
- [转]HTTP请求模型和头信息
- 【DL4J速成】Deeplearning4j图像分类从模型自定义到测试
- linux deepin安装virtualbox 6.1命令
- aix卸载java,AIX系统学习之--卸载软件错误
- Bash数组操作教程
- 【算法系列之一】二叉树最小深度
- hadoop--常见错误及解决方法
- JavaScript通用表单验证函数
- iis服务器并发支持人数 主要参数_服务器常见问题解决
- c语言关键字中文意思,C语言的32个关键字是什么意思啊
- Unable to compile class for JSP异常
- 无需训练 RNN 或生成模型,如何编写一个快速且通用的 AI “讲故事”项目?
- eligius矿池设置
- 基于Web的svg编辑器(1)——撤销重做功能
- 大功率UWB模块 XZM3000 移植手册 《从DWM1000到XZM3000移植手册》
- 电脑网速检测在哪里可以找到
- C语言float去尾法输出,c语言去尾法怎么写
- 工程师小哥魔术揭秘“三仙归洞”,把我都看蒙了!
- iOS 开发 : 14个技巧助你适配 iOS10
热门文章
- HR/猎头眼中的好简历是什么样子的?
- makesfx.exe (Make SFX (Self-extracting archive))
- 输入127.0.0.1:8000/admin/登录不上
- matlab的数值求解实验报告,matlab计算方法实验报告5(数值积分)
- 365 - yongqiang
- 阳明同调(琴语言第1讲专用领域语言基础)
- Vue——formcreate表单设计器自定义组件实现
- 如何才能有效清除新房甲醛
- 在线直播源码直播全流程探索
- python数据分析软件0代码,python数据分析软件开发