Mysql锁机制-全局锁,表级锁,行级锁
全局锁:
当业务需要让整个库处于只读状态的时候,可以使用这个命令,之后其他线程的数据更新操作,数据定义语句【建表,修改表结构】都会被阻塞
适用场景:全库逻辑备份
加全局读锁的方法,命令Flush tables with read lock【FTWRL】
如果整库是只读状态会出现什么情况:
A.如果在主库上备份,那么在备份期间都不能执行更新,业务阻塞
B.如果在从库上备份,那么在备份期间从库不能执行主库同步过来的binlog,导致主从同步延迟
备份如果不加锁会出现哪些情况?假设有一个用户余额表,一个课程表
如果不加锁,备份系统备份得到的库不是一个逻辑时间点,这个视图是逻辑不一致的
如何解决备份加锁的问题
如果表使用InnoDB引擎,则使用可重复读隔离级别,在导数据之前启动一个事务,确保拿到一致性视图;
如果是其他引擎,则使用FTWRL命令,如果在执行FTWRL命令之后由于客户端发送异常断开,那么Mysql会自动释放这个全局锁,整个库回到可以正常更新的状态,如果是global设置为readonly=true,发生异常,数据库会保持readonly=true,导致整个库处于不可写状态
表级锁:【表锁,元数据锁】
表锁的语法:lock tables ... read/write,释放锁unlock tables
元数据锁【MDL】:不需要显示使用,在访问一张表的时候会被自动加上
MDL的作用:保证读写的正确性
MySql5.5版本之后引入了MDL,当对一张表做增删改查操作的时候,加MDL读锁;当要对表做结构变更操作的时候,加MDL写锁
优点:读锁之间不互斥;读写锁之间,写锁之间互斥,保证变更表结构操作的安全性
在对表进行修改操作的时候,需要谨慎处理,否则会影响线上服务,即使是小表,假设先后开启四个事务A,B,C,D,事务A,B,D为读锁,事务C为写锁,事务A未释放,事务B可以正常执行,事务C被阻塞,事务D申请读锁被事务C阻塞,假设事务A为长事务,事务D的客户端有重试机制,不断的申请新的请求,将导致整个库线程爆满
为一张表加字段,修改字段,增加索引,需要全表扫描
所有对表的增删改查操作都需要先申请MDL读锁
事务中的MDL锁,在语句执行开始时申请,但是语句
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
Java全新整理八股文 + 场景题 + 算法 精心设计,面试命中率超过80% 专栏优势: 1、问题和答案已经整理到位,答案更专业,可以直接回答,不需要额外总结! 2、场景题讲解清晰,适用于大部分场景的项目,并且持续更新中 3、分享学习心得【知识点的广度和深度,算法有哪些坑,如何准备面试等等】