MySQL锁有几类?
全局锁
什么是全局锁?
全局锁就是对整个数据库实例加锁,当数据库被加上全局锁以后,整个库会处于只读状态,处于只读状态下的库,以下语句会被阻塞:
整个库只读有什么危害?
如何加全局锁?
-- FTWRL
flush tables with read lock ;
全局锁的使用场景?
全库逻辑备份:把每个表都select成文件。
mysqldump
除了上述select可以进行逻辑备份,官方提供了mysqldump为逻辑备份工具。
-- single-transaction参数会在导数据前启动事务,拿到一致性视图。
-- 此逻辑备份期间,其他事务可以正常对数据进行更新
mysqldump -h 127.0.0.1 -P 3306 -u root -p --databases test --single-transaction > test.sql
mysqldump --single-transaction的弊端?
single-transaction只适用于所有表使用事务引擎的库。这也是InnoDB引擎逐渐取代MyISAM的原因。
global readonly
除了对数据库加全局锁可以让整个数据库只读以外,我们可以使用以下命令也可以让全库进入只读状态:
set global read_only = true;
global readonly的弊端
表级锁
表级锁的分类有哪几种
如何加表锁
-- 给test1表加读锁
-- 给test表加写锁
lock tables test1 read, test write;
-- 释放锁
unlock tables ;
锁 | 加锁线程 | 其他线程 |
---|---|---|
读锁 | 只能读取被加锁的表, 无法进行其他表的操作 | 可以查询被加锁的表,更新会被阻塞 |
写锁 | 只能对被加锁的表进行读写操作 | 对被加锁表的任何操作都会被阻塞 |
什么是元数据锁(MDL)?
元数据锁不需要显示使用,在访问一个表的时候会被自动加上。
元数据锁主要用来保证读写的正确性:
元数据的读写锁有啥特点?
如何安全的给表变更字段?
首先需要解决长事务,因为长事务会占用着MDL锁,此时需要考虑暂停DDL或者kill掉这个长事务。
如果是热点数据表,此时可能kill会无效果,因此最好在alter table的时候指定一个最大时间,如果在该指定时间内获取到MDL锁就执行,如果获取不到就放弃。
目前MySQL8在SQL语句上还不支持,但是可以通过配置参数lock_wait_timeout进行控制,但是MariaDB已经在SQL语句上支持该功能。
什么是Online DDL?
Online DDL的过程如下:
1、2、4、5如果没有锁冲突,执行时间将非常短,第3步占用绝大多数时间,这个期间可以正常读写数据,因此称为Online DDL。
Online DDL可以在做代表DDL的同时进行DML。
如果Online DDL都无法解决实现,也可以使用pt-online-schema-change进行在线DDL。
行锁
全局锁和表锁的实现都是在Server层进行实现,但行锁是由各个引擎自己实现,不支持行锁意味着并发控制只能使用表锁。
什么是行锁?
行锁就是对数据表中的行记录加锁,比如事务A更新了一行,事务B也要更新同一行,则必须等事务A的操作完成以后才能进行更新。
行锁什么时候加,什么时候释放?
InnoDB的事务中,行锁是在需要的时候添加,但是释放是在事务结束时。
InndoDB的行锁是通过锁索引记录实现的,如果你update的条件没有索引的话,那么将会对整张表进行加锁。
什么是死锁?
并发系统中不同线程出现循环资源依赖,涉及的线程在等待别的线程释放资源,这几个线程之间就会形成死锁陷入无线等待。
上图中事务A在等待事务B释放id=2的行锁,而事务B又在等待事务A释放id=1的行锁,两个事务之间形成死锁。
如何解决死锁?
使用超时等待主要有以下弊端:
死锁检测的弊端:
其他解决死锁方案
备库使用--single-transaction做逻辑备份会有什么问题?
mysqldump --single-transaction进行逻辑备份的时候主要有以下过程:
-- 备份开始时设置隔离级别
set session transaction isolation level repeatable read;
-- 启用事务,获取一致性视图
start transaction with consistent snapshot ;
-- 设置一个保存点
savepoint `sp`;
-- 获取test表的表结构
-- 时刻1
show create table `test`;
-- 开始导数据
-- 时刻2
select * from `test`;
-- 时刻3
-- 回滚到保存点,释放test表的MDL锁
rollback to savepoint `sp`;
-- 时刻4
DDL的binlog从主库传递到从库的上述4个时刻逻辑备份会有不同的表现:
test
;执行的时候会报错,mysqldump命令会被终止sp
结束扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有